ایجاد: ۱۳:۱۴ ۱۳۹۱/۶/۱۱
ویرایش: ۱۵:۳۵ ۱۴۰۳/۳/۲۹
»
ایجاد فایل پشتیبان
جهت ایجاد فایل بکآپ، از دستور mysqldump استفاده میشود. در این دستور ابتدا لازم است نام کاربری و پسورد به یکی از صورتهای زیر ذکر شود:
mysqldump –-user [myUserName] –-password=[myPassword] ...
mysqldump –u [myUserName] –p[myPassword] ...
چند نکته:
- در مورد بقیه دستور (که سه نقطه گذاشتم) در ادامه توضیح داده شده.
- به دلیل اختلاف نسخ لینوکس و mysql گاهی لازم است بعد از u و حتی گاهی p در دستور دوم، یک فاصله درج شود و گاهی نشود. اما دستور اول جامع بوده و در تمامی ورژنهای این پایگاه داده در هر سیستم عاملی کار میکند.
- نام کاربری و پسوردی که در اینجا درج میشود، مربوط به یک کاربر mysql است که حداقل سطح دسترسی select و lock table را داشته باشد.
- کوئریهای اجرا شده معمولا log میشوند. همچنین اگر کسی دستور ps یا top را اجرا کند، میتواند دستور فوق را (که حاوی پسورد هم هست!) ببیند و این خطرناک است.
اگر از طریق خط فرمان به صورت آنلاین دستورات فوق را اجرا کنیم، پسورد میتواند درج نشود و پس از درج دستور فوق، مجزا سوال میشود.
اما اگر بخواهیم به وسیله یک اسکریپت بکآپ بگیریم، چطور؟ (خصوصا اسکریپتهای کرانجاب)
در اینگونه موارد راه حل این است که در پوشه کاربر (پوشه root کاربر اصلی و پوشه home بقیه کاربران) فایلی با نام my.cnf. ایجاد و در آن پسورد را به صورت زیر یادداشت کنیم. در این صورت دیگر نیازی به درج نام کاربری و کلمه عبور نیست. (توضیح بیشتر و دقیقتر)
[mysqldump]
user=myUserName
password=myPassword
در صورتی که بخواهیم از تمام دیتابیسهایی که کاربر با شناسه myUserName و رمز myPassword به آن دسترسی دارد، بکآپ بگیریم، میتوان از سوئیچ all-databases-- یا A- کرد:
mysqldump –-user [myUserName] –-password=[myPassword] --all-databases > all_databases.sql
mysqldump –-user [myUserName] –-password=[myPassword] -A > all_databases.sql
در صورتی که بخواهیم از چند پایگاه داده مشخصی مثلا با نام test1 و test2 و test3 پشتیبان تهیه کنیم، میتوان اینگونه عمل کرد:
mysqldump –-user [myUserName] –-password=[myPassword] --databases test1 test2 test3 > test123.sql
mysqldump -B –-user [myUserName] –-password=[myPassword] test1 test2 test3 > test123.sql
نکته: اگر در دستور فوق از سوئیچ B استفاده نمیکردیم، test2, test3 به عنوان نام جداول دیتابیس test1 در نظر گرفته میشد.
در صورتی که بخواهیم از 1 پایگاه داده مشخصی مثلا با نام test، پشتیبان تهیه کنیم، علاوه بر دستور فوق، میتوان دستور سادهتر زیر را نیز استفاده کرد:
mysqldump –-user [myUserName] –-password=[myPassword] test > test.sql
دستورات فوق از تمام جداول موجود در دیتابیس(های) موردنظر بکآپ میگیرد.
اگر بخواهیم فقط از یک یا چند جدول خاص از 1 دیتابیس مثلا با نام test پشتیبان تهیه کنیم، میتوان اینگونه عمل کرد:
mysqldump –-user [myUserName] –-password=[myPassword] --databases test --tables user post comment > some_table.sql
mysqldump –-user [myUserName] –-password=[myPassword] test user post comment > some_table.sql
همانطور که چندخط بالاتر گفتیم، اگر در دستور دوم از سوئیچ B استفاده کنیم، تمام 4 کلمه test, user, post, comment به عنوان نام دیتابیس درنظر گرفته میشد.
اگر بخواهیم تمام جداول یک دیتابیس را بکآپ بگیریم بجز یک یا چند جدول خاص؛ یک راه برای انجام این کار اینگونه است:
mysqldump –-user [myUserName] –-password=[myPassword] test --ignore-table=test.table1 --ignore-table=test.table2 > test_special.sql
نکته1: میتوان خروجی دستور mysqldump را مثل هر دستور لینوکسی دیگر، به دستور دیگری (مثلا gzip) فرستاد تا خروجی فشرده تولید شود:
mysqldump --user [myUserName] --password=[myPassword] test |gzip > test.gz
نکته2: هنگام تهیه پشتیبان از یک جدول، میتوان تنها برخی از رکوردهای آن جدول را بکآپ گرفت و از شرط (WHERE) برای تعیین فیلدهایی که باید بکآپ گرفته شوند، استفاده کرد:
mysqldump -uUSER -pPASS --where="post_status = 'draft'
AND comment_status = 'closed'" wpDatabase wp_posts_table > subset.sql
بازگردانی فایل پشتیبان
برای بازگردانی میتوان از دستور mysql استفاده نمود:
mysql -u [uname] -p[pass] [db_to_restore] < [backupfile.sql]
gunzip < [backupfile.sql.gz] | mysql -u [uname] -p[pass] [db_to_restore]
دستور اول برای بازگردانی یک فایل sql به یک دیتابیس خاص و دستور دوم برای بازگردانی یک فایل sql فشرده شده بکار میرود.
زمانی که دیتابیس از قبل موجود باشد، معمولا از دستور mysqlimport استفاده میشود:
mysqlimport -u [uname] -p[pass] [dbname] [backupfile.sql]
انتقال دیتابیس از یک سرور به سرور دیگر
گاهی یک سرور فقط برای بکآپ بکار میرود یا برای ایجاد یک آیینه (mirror) از اطلاعات. در این صورت ممکن است ما بخواهیم گاهی به صورتی دستی یا به صورت اتوماتیک (با کرانجاب) در فواصل زمانی معین، یک کپی از دیتابیسمان را در دیتابیس سروری دیگر ایجاد نماییم. برای این کار میتوان از دستور زیر برای انتقال یک دیتابیس (مثلا به نام test) ستفاده کرد:
mysqldump -u myUserName -p myPassword test | mysql --host=25.3.52.127 -C test
دو نکته پیرامون دستور فوق:
- سرور مقصد (با ip فوق) لازم است اجازه remote access برای اتصال به بانک را داده باشد
- آبشن h- یا host-- در دستور mysql اختیاری بود و مقدار پیشفرض آن localhost بود. به همین دلیل در دستورات مربوط به ریستور که در خطوط قبل از کد فوق گفتیم، آن را ذکر نکردیم اما در کد بالا چون قصد بازگردانی بر روی سروری دیگر را داشتیم، لازم بود آن سرور را با درج ip کاملا مشخص نماییم.
ارسال بکآپ به ایمیل
برای این کار میتوان از برنامه uuencode مطابق شکل زیر استفاده کرد:
mysqldump --user=myUserName --password=myPassword dbname | gzip | uuencode dbbackup_e.gz | mail [email protected]
در صورتی که این برنامه بر روی سرور نصب نباشد، با دستور زیر قابل نصب است:
yum install sharutils
منابع
یادداشتهای مرتبط
- پایگاه داده MySQL و مدیریت آن
- کار با داده های سلسله مراتبی در پایگاه داده
- کلید خارجی (Foreign Key) ، محاسن و معایب آن
- پایگاه داده در جاوا اسکریپت