نحوه ایمپورت و اکسپورت دیتابیس در MySQL یا MariaDB

مقدمه
ایمپورت و اکسپورت دیتابیسها، وظیفه رایجی در توسعه نرمافزار و مدیریت سیستم است. میتوانید از Dumpهای داده برای بکاپ و بازیابی اطلاعات، تکثیر محیطها یا مهاجرت داده به سرور یا ارائهدهنده هاستینگ جدید استفاده کنید.
در این آموزش، با Dumpهای دیتابیس در MySQL یا MariaDB کار میکنید (دستورات قابلتبدیل به هماند). با اکسپورت کل دیتابیس به فایل .sql با mysqldump شروع میکنید؛ سپس یاد میگیرید چطور آن فایل را با کلاینت mysql ایمپورت کنید. بعد کاوش میکنید چطور فقط جداول خاصی را اکسپورت و ایمپورت کنید، حسابهای کاربری و دسترسیها را مهاجرت دهید و فایلهای Dump بزرگ SQL را کارآمد مدیریت کنید. این مهارتها برای بکاپهای روتین، کلونکردن محیط، مهاجرتهای پروداکشن یا عیبیابی مسائل داده بین محیطهای مختلف ضروریاند.
با یک کلیک، دیتابیس دیپلوی کنید با دیتابیسهای مدیریتشده پارمین کلود. بگذارید پارمین کلود روی مقیاسپذیری، نگهداری و ارتقاهای دیتابیس شما تمرکز کند.
نکات کلیدی
- mysqldump ابزار استاندارد بکاپهای منطقی است. ساختار و داده دیتابیس را به فایل .sqlای اکسپورت میکند که راحت بین سیستمها منتقل یا بازیابی میشود.
- میتوانید Dump را در دیتابیس جدید یا موجود با کلاینت mysql ایمپورت کنید. قبل از ایمپورت، تأیید کنید دیتابیس هدف وجود دارد. در صورت نیاز از CREATE DATABASE استفاده کنید.
- اکسپورتهای جدول انتخابی پشتیبانی میشوند. میتوانید فقط جداول خاصی را با mysqldump—با فهرست کردن نام جداول بعد از نام دیتابیس—اکسپورت و ایمپورت کنید.
- حسابهای کاربری و دسترسیها باید جداگانه مهاجرت کنند. چون اعتبارنامههای کاربر در دیتابیس سیستمی mysql ذخیره میشوند؛ باید جدولهای Grant مربوطه را اکسپورت یا دستورات GRANT را دستی تولید کنید.
- اکسپورتهای فشرده، فضا ذخیره و انتقال را سریع میکنند. میتوانید خروجی mysqldump را از طریق gzip پایپ و حین ایمپورت از حالت فشرده خارج کنید تا ذخیرهسازی و کارایی بهینه شود.
- برای دیتابیسهای بزرگ InnoDB از –single-transaction و –quick استفاده کنید. این گزینهها اکسپورتهای سازگار و بدون-قفل میسازند و مصرف حافظه را کم میکنند.
- فایلهای SQL بزرگ را میتوان برای ایمپورتهای نرمتر به قطعاتی تقسیم کرد. با دستور split میتوانید فایلهای Dump بزرگ را به قطعات قابلمدیریت بشکنید تا از تایماوتها یا مسائل حافظه اجتناب شود.
- مسائل رایج، مثل خطاهای «جدول از قبل وجود دارد»، با فلگهایی مثل –add-drop-table قابل اجتناباند. همیشه فایل Dump را بازرسی یا تغییر دهید تا با محیط مقصد مطابقت کند و از بازنویسیهای ناخواسته جلوگیری شود.
پیشنیازها
برای ایمپورت یا اکسپورت دیتابیس MySQL یا MariaDB، به این موارد نیاز دارید:
- یک ماشین مجازی با کاربر sudo غیر root. اگر سرور لازم دارید، برای ساخت سرور پارمین کلود با توزیع لینوکسی مورد علاقهتان به اینجا بروید. بعد از ساخت، توزیعتان را از این فهرست انتخاب و راهنمای راهاندازی اولیه سرور پارمین کلود را دنبال کنید.
- MySQL یا MariaDB نصبشده. برای نصب MySQL، آموزش «نحوه نصب MySQL» در پارمین کلود را دنبال کنید. برای نصب MariaDB، آموزش «نحوه نصب MariaDB» را دنبال کنید.
- یک دیتابیس نمونه در سرور دیتابیستان ساختهشده. برای ساخت یکی، بخش «ساخت دیتابیس نمونه» در آموزش «مقدمهای بر کوئریها در MySQL» پارمین کلود را دنبال کنید.
نکته: بهعنوان جایگزینی برای نصب دستی، میتوانید اپلیکیشن یک-کلیکی MySQL مارکتپلیس پارمین کلود را کاوش کنید.
اکسپورت و ایمپورت دیتابیس MySQL یا MariaDB
اکسپورت و ایمپورت دیتابیسها، بخشی روتین از مدیریت دیتابیس است. چه در حال بکاپ گرفتن دادههایتان، بازیابی به محیط جدید یا مهاجرت بین سرورها باشید—اغلب لازم است Dump دیتابیس بسازید و سپس آن Dump را در Instance دیتابیس دیگری بارگذاری کنید.
در این بخش، اول محتوای دیتابیس MySQL یا MariaDB موجودی را به فایل .sql با mysqldump اکسپورت میکنید. سپس، آن فایل را در دیتابیس جدیدی با کلاینت خط فرمان mysql ایمپورت میکنید. این ابزارها هنگام نصب MySQL یا MariaDB بهطور پیشفرض موجودند و برای هر دو سیستم به همان شکل کار میکنند.
اکسپورت دیتابیس MySQL یا MariaDB
ابزار کنسولی mysqldump، دیتابیسها را به فایلهای متنی SQL اکسپورت میکند. این انتقال و جابهجایی دیتابیسها را آسانتر میکند. به نام دیتابیستان و اعتبارنامههای حسابی نیاز دارید که دسترسیهایش حداقل فقط-خواندنیِ کامل به دیتابیس را مجاز بداند.
از mysqldump برای اکسپورت دیتابیستان استفاده کنید:
mysqldump -u username -p database_name > data-dump.sql
usernameنام کاربریای است که میتوانید با آن وارد دیتابیس شوید.database_nameنام دیتابیسی است که اکسپورت میشود.data-dump.sqlفایلی در دایرکتوری فعلی است که خروجی را ذخیره میکند.
دستور هیچ خروجی ترمینالی تولید نمیکند؛ اما میتوانید محتوای data-dump.sql را بازرسی کنید تا چک کنید فایل Dump SQL قانونی است.
دستور زیر را اجرا کنید:
head -n 5 data-dump.sql
بالای فایل باید شبیه این باشد؛ که Dump مربوط به MySQL برای دیتابیسِ با نام database_name را نشان میدهد:
SQL dump fragment
-- MySQL dump 10.13 Distrib 5.7.16, for Linux (x86_64)
--
-- Host: localhost Database: database_name
-- ------------------------------------------------------
-- Server version 5.7.16-0ubuntu0.16.04.1
اگر خطایی حین فرایند اکسپورت رخ دهد، mysqldump آنها را روی صفحه چاپ میکند.
ایمپورت دیتابیس MySQL یا MariaDB
برای ایمپورت فایل Dump موجودی به MySQL یا MariaDB، باید دیتابیس جدیدی بسازید. این دیتابیس دادههای ایمپورتشده را نگه میدارد.
اول، بهعنوان root یا کاربر دیگری با دسترسیهای کافی برای ساخت دیتابیسهای جدید وارد MySQL شوید:
mysql -u root -p
این دستور شما را به پرامپت شل MySQL میبرد. بعد، با دستور زیر دیتابیس جدیدی بسازید. در این مثال، دیتابیس جدید new_database نامیده میشود:
CREATE DATABASE new_database;
این خروجی را میبینید که ساخت دیتابیس را تأیید میکند:
Output
Query OK, 1 row affected (0.00 sec)
سپس با فشار CTRL+D از شل MySQL خارج شوید. از خط فرمان معمولی، میتوانید فایل Dump را با دستور زیر ایمپورت کنید:
mysql -u username -p new_database < data-dump.sql
usernameنام کاربریای است که میتوانید با آن وارد دیتابیس شوید.new_databaseنام دیتابیسِ تازه-ساختهشده است.data-dump.sqlفایل Dump داده برای ایمپورت است؛ که در دایرکتوری فعلی قرار دارد.
اگر دستور با موفقیت اجرا شود، هیچ خروجیای تولید نمیکند. اگر خطایی حین فرایند رخ دهد، mysql آنها را بهجای آن در ترمینال چاپ میکند. برای چک کردن موفقیت ایمپورت، وارد شل MySQL شوید و دادهها را بازرسی کنید. دیتابیس جدید را با USE new_database انتخاب کنید و سپس از SHOW TABLES; برای دیدن فهرست جداول و تأیید دادههای ایمپورتشده استفاده کنید.
اکسپورت و ایمپورت فقط جداول خاص
در برخی موارد، ممکن است بخواهید فقط چند جدول خاص را بهجای کل دیتابیس اکسپورت یا ایمپورت کنید. این میتواند هنگام کار با دیتابیسهای بزرگ، دیباگ یا مهاجرت فقط زیرمجموعهای از دادههایتان مفید باشد.
اکسپورت جداول خاص
برای اکسپورت یک یا چند جدول خاص، نام جداول را بهعنوان آرگومان به دستور mysqldump بعد از نام دیتابیس پاس بدهید:
mysqldump -u username -p database_name table1 table2 > selected-tables.sql
usernameحساب کاربری دیتابیس شماست.database_nameنام دیتابیسی است که جداول را در بر دارد.table1،table2و غیره، جداول خاصی هستند که میخواهید اکسپورت کنید.selected-tables.sqlفایل خروجی حاوی دادهها و ساختار جدولهای اکسپورتشده است.
مثلاً برای اکسپورت فقط جداول users و orders از دیتابیسی به نام store، این را اجرا میکردید:
mysqldump -u root -p store users orders > users-orders.sql
این دستور Dump SQLای تولید میکند که فقط جداول تعیینشده و دادههایشان را شامل میشود. میتوانید محتوا را با باز کردن فایل در ویرایشگر متنی یا بازرسی چند خط اول تأیید کنید:
head -n 10 users-orders.sql
ایمپورت جداول خاص
برای ایمپورت جداول خاص از فایل Dump، از دستور mysql درست مثل ایمپورت کامل دیتابیس استفاده کنید. اما مطمئن شوید دیتابیس مقصد قبل از اجرای ایمپورت از قبل وجود دارد.
mysql -u username -p target_database < selected-tables.sql
مثلاً برای ایمپورت جداول users و orders از Dump قبلی به دیتابیس جدیدی به نام test_store، استفاده کنید:
mysql -u root -p test_store < users-orders.sql
این فقط جداول تعیینشده را در دیتابیس test_store بازسازی و پر میکند. اگر جداول از قبل در دیتابیس مقصد وجود داشته باشند، بازنویسی میشوند؛ مگر اینکه فایل Dump با گزینههایی برای رد کردن ساخت جدول یا Insertها تولید شده باشد.
برای تأیید جداول ایمپورتشده، وارد شل MySQL شوید و جداول را چک کنید:
mysql -u root -p
سپس در پرامپت MySQL:
USE test_store;
SHOW TABLES;
باید فقط جداول ایمپورتشده را فهرستشده ببینید.
اکسپورت و ایمپورت با دسترسیهای کاربر
هنگام مهاجرت دیتابیس MySQL یا MariaDB، کپی کردن فقط دادهها کافی نیست. همچنین باید مطمئن شوید حسابهای کاربری و دسترسیهای درست هم با آن میآیند. این اعتبارنامهها و مجوزها درون دیتابیسهای منفرد ذخیره نمیشوند؛ در دیتابیس سیستمی خاصی به نام mysql زندگی میکنند؛ که همه اطلاعات کنترل دسترسی کاربر را نگه میدارد.
بهطور پیشفرض، mysqldump فقط ساختار و داده دیتابیس اپلیکیشن را اکسپورت میکند. حسابهای کاربری، رمزهای عبورشان یا قوانین دسترسیشان را شامل نمیشود؛ مگر صریحاً درخواستشان کنید.
دو روش رایج برای مهاجرت حسابهای کاربری و دسترسیهایشان وجود دارد. هر رویکرد بدهبستانهای خودش را دارد؛ بسته به اینکه برای کاملبودن بهینه میکنید یا قابلیت حمل.
روش ۱: Dump کردن جدولهای Grant از دیتابیس mysql
این روش جدولهای داخلی کلیدیِ ذخیرهکننده جزئیات حساب کاربری و دسترسیهای مرتبط با آنها را میگیرد. راه سریع و مستقیمی برای تکثیر دسترسی کاربر است؛ بهویژه هنگام مهاجرت بین نسخههای سرور مشابه.
گام ۱: اکسپورت حسابهای کاربری و دسترسیها
برای اکسپورت کاربران بههمراه دسترسیهای سراسری، سطح-دیتابیس، سطح-جدول، سطح-ستون و سطح-روتین، اجرا کنید:
mysqldump -u root -p mysql user db tables_priv columns_priv procs_priv > users_and_privileges.sql
این دستور فایل Dump SQLای میسازد که شامل اینهاست:
- نامهای کاربری و اتصالهای هاست
- رمزهای عبور Hash-شده
- دسترسیهای تخصیصیافته در سطوح مختلف
مهم: کل دیتابیس mysql را Dump نکنید. شامل متادیتای داخلی مانند پیکربندی سرور و داده پلاگین است؛ که ممکن است با سرور مقصدتان سازگار نباشد. فقط به جدولهای مرتبط-با-Grant پایبند بمانید.
گام ۲: ایمپورت روی سرور مقصد
وقتی فایل Dump روی ماشین مقصد موجود شد، میتوانید مستقیم در دیتابیس سیستمی mysql ایمپورتش کنید:
mysql -u root -p mysql < users_and_privileges.sql
گام ۳: ریلود دسترسیها
بعد از ایمپورت، جدولهای Grant را دستی ریلود کنید تا سرور تغییرات را بشناسد:
FLUSH PRIVILEGES;
این دستور را میتوان از شل MySQL اجرا کرد. همه حسابهای کاربری ایمپورتشده و مجوزهایشان را فوراً فعال میکند—بدون نیاز به ریاستارت سرور دیتابیس.
روش ۲: تولید دستورات GRANT (توصیهشده برای قابلیت حمل)
اگر به نسخه متفاوتی از MySQL یا MariaDB مهاجرت میکنید؛ یا کنترل و شفافیت بیشتری روی کاربرانی که منتقل میکنید میخواهید، این روش اغلب ترجیح داده میشود. بهجای کپی جدولهای خام سیستمی، دستورات GRANT واقعیای که دسترسیهای کاربر را تعریف میکنند را استخراج میکند.
گام ۱: تولید دستورات GRANT
میتوانید اسکریپت SQL دستورات GRANT را برای همه کاربران غیر-سیستمی با این one-liner شلی تولید کنید:
mysql -B -N -u root -p -e "SELECT CONCAT('SHOW GRANTS FOR ''', user, '''@''', host, ''';') FROM mysql.user WHERE user NOT IN ('mysql.infoschema', 'mysql.session', 'mysql.sys', 'root')" \
| mysql -B -N -u root -p \
| sed 's/$/;/' > all_user_grants.sql
این دستور این کارها را میکند:
- بخش اول همه حسابهای کاربری معمولی را از جدول mysql.user انتخاب میکند.
- بخش دوم SHOW GRANTS را به ازای هر کاربر اجرا میکند.
- دستور sed به هر خط سمیکالنی الصاق میکند تا سینتکس SQL معتبر تضمین شود.
- خروجی نهایی بهعنوان all_user_grants.sql ذخیره میشود.
این فایل فهرست تمیز و خوانایی از دستورات GRANT است که روی سرور دیگری قابل اعمال است.
گام ۲: مرور و ایمپورت اسکریپت GRANT
فایل all_user_grants.sql را در ویرایشگر متنی باز و مرورش کنید. میتوانید هر خط مربوط به کاربرانی را که نمیخواهید مهاجرت کنند حذف کنید.
برای اعمال دسترسیها روی سرور جدید، اجرا کنید:
mysql -u root -p < all_user_grants.sql
چون دستور GRANT بهطور ضمنی کاربران را میسازد و دسترسیها را تخصیص میدهد، FLUSH PRIVILEGES دستی اکیداً لازم نیست؛ اما اجرایش بعدش تمرین خوبی است:
FLUSH PRIVILEGES;
این روش عموماً امنتر و قابلحملتر بین نسخههای مختلف MySQL یا MariaDB است؛ چون از ایمپورت مستقیم جدولهای داخلی سیستمی اجتناب میکند.
کار با فایلهای .sql بزرگ و ایمپورتهای کند
هنگام کار با دیتابیسهای بزرگ، ایمپورتها میتوانند بهطور محسوسی کند یا منابع-سنگین باشند. فایلهای .sql بزرگ پردازش طولانیتری میخواهند؛ و بسته به سختافزار و پیکربندی سرور، این میتواند به تایماوتها، جداول قفلشده یا کارایی تنزلیافته منجر شود.
اینجا چند استراتژی برای مدیریت و سرعت بخشیدن به فرایند ایمپورتِ Dumpهای بزرگ دیتابیس هست.
استفاده از فشردهسازی برای صرفهجویی در فضا و زمان
میتوانید فایل Dump دیتابیس را با gzip فشرده کنید تا حجم فایل کم و زمان انتقال سریع شود. خروجی mysqldump را میتوان مستقیم به gzip پایپ کرد؛ که نیاز به ذخیره نسخه فشردهنشده را حذف میکند:
mysqldump -u username -p database_name | gzip > database_name.sql.gz
برای ایمپورت از فایل فشرده، از gunzip برای خارج کردن دادهها از حالت فشرده و استریمکردن آنها به کلاینت mysql استفاده کنید:
gunzip < database_name.sql.gz | mysql -u username -p database_name
این روش بهویژه هنگام جابهجایی دادهها بین شبکهها یا کار با محیطهای با-فضای-ذخیرهسازی-محدود مفید است.
غیرفعال کردن موقت بررسیهای کلید خارجی و ایندکسها
حین ایمپورت، MySQL قوانین کلید خارجی را الزامی میکند و بهروزرسانیهای ایندکس را به ازای هر ردیف درجشده انجام میدهد. میتوانید این بررسیها را موقتاً غیرفعال کنید تا کارایی بهبود یابد.
در ابتدای فایل .sql خود—یا قبل از اجرای ایمپورت—قوانین را غیرفعال کنید:
SET foreign_key_checks = 0;
SET unique_checks = 0;
SET autocommit = 0;
در انتهای ایمپورت، دوباره فعالشان کنید و تغییرات را Commit کنید:
SET foreign_key_checks = 1;
SET unique_checks = 1;
COMMIT;
میتوانید این خطوط را دستی به فایل Dump اضافه یا قبل و بعد از ایمپورت بهصورت تعاملی اجرایشان کنید. این سربار حین عملیاتهای درج بزرگ را کاهش میدهد.
استفاده از فلگهای –quick و –single-transaction
هنگام اکسپورت دیتابیسهای بزرگ InnoDB، گزینههای --quick و --single-transaction را به دستور mysqldump خود اضافه کنید:
mysqldump -u username -p --single-transaction --quick database_name > database_name.sql
--single-transactionاسنپشات سازگاری از دیتابیس بدون قفل کردن جداول میسازد.--quickردیفها را مستقیم به فایل خروجی استریم میکند؛ بدون بارگذاری همهشان در حافظه.
این ترکیب برای جداول بزرگ InnoDB ایدهآل است و تضمین میکند حین فرایند اکسپورت، حداقل اثر روی دیتابیس در حال اجرا بگذارد.
تقسیم فایل SQL به قطعات کوچکتر
برای فایلهای Dump بسیار بزرگ، میتوانید فایل را با دستور split به قطعات کوچکتر و قابلمدیریتتری تقسیم کنید. این میتواند کمک کند از برخورد با محدودیتهای حافظه یا تایماوت حین ایمپورت اجتناب شود:
split -l 5000 large_dump.sql chunk_
این دستور چندین فایل با نامهای chunk_aa، chunk_ab و غیره میسازد؛ که هر کدام ۵٬۰۰۰ خط دارند. سپس میتوانید آنها را ترتیبی ایمپورت کنید:
for file in chunk_*; do
mysql -u username -p database_name < "$file"
done
این رویکرد به شما اجازه میدهد پیشرفت را مانیتور و در صورت قطع شدن فرایند راحتتر بازیابی کنید.
استفاده از LOAD DATA INFILE برای دادههای انبوه
اگر دادههایتان در قالب ساده .csv یا .tsv موجودند، میتوانید از دستور LOAD DATA INFILE برای ایمپورتهای انبوهِ بهطور قابلتوجه سریعتر استفاده کنید. این روش از پارس استاندارد SQL عبور میکند و دادهها را مستقیم در جدول درج مینماید:
LOAD DATA INFILE '/path/to/file.csv'
INTO TABLE table_name
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 LINES;
این یکی از سریعترین راههای ایمپورت حجمهای زیادی از داده خام جدولی در MySQL یا MariaDB است؛ اما نیازمند آن است که دادههایتان در قالب ساختاریافته و جدا-شده باشند.
اشتباهات رایج برای اجتناب
اکسپورت و ایمپورت دیتابیسهای MySQL یا MariaDB وظیفه بحرانیای است؛ بهویژه در محیطهای پروداکشن. در حالی که فرایند عموماً سرراست است، غفلتهای کوچک میتوانند به از دست رفتن داده، ایمپورتهای شکستخورده یا اپلیکیشنهای خراب منجر شوند. این بخش برخی از رایجترین اشتباهات و نحوه اجتناب مؤثر از آنها را مرور میکند.
۱. ایمپورت در دیتابیس اشتباه
اشتباه رایجی است وقتی که بهطور تصادفی فایل .sqlای را در دیتابیس اشتباهی ایمپورت میکنید؛ بهویژه هنگام کار بین چندین محیط. این میتواند بدون هشدار، دادههای موجود را بازنویسی یا خراب کند. همیشه قبل از اجرای دستور ایمپورت، نام دیتابیس را دوباره چک کنید:
mysql -u username -p target_database < data-dump.sql
همچنین میتوانید بعد از ایمپورت، در شل MySQL از SHOW TABLES; و SELECT COUNT(*) FROM table_name; برای تأیید حضور دادههای مورد انتظار استفاده کنید.
۲. فراموش کردن ساخت دیتابیس هدف
دستور ایمپورت mysql فرض میکند دیتابیس مقصد از قبل وجود دارد. اگر نباشد، با خطایی مثل Unknown database روبهرو میشوید. مطمئن شوید اول دیتابیس را بسازید:
CREATE DATABASE new_database;
بهعنوان جایگزین، از گزینه --databases با mysqldump حین اکسپورت استفاده کنید تا دستورات CREATE DATABASE و USE در فایل Dump گنجانده شوند.
۳. استفاده از اعتبارنامههای نادرست یا دسترسیهای ناکافی
اگر حساب کاربریِ استفادهشده برای اکسپورت یا ایمپورت، دسترسیهای لازم را نداشته باشد، عملیاتها شکست میخورند. مثلاً:
- mysqldump ممکن است بدون دسترسیهای SELECT، LOCK TABLES یا SHOW VIEW شکست بخورد.
- mysql ممکن است در ایمپورت دادهها شکست بخورد اگر کاربر مجوزهای INSERT، CREATE یا ALTER نداشته باشد.
اگر مطمئن نیستید، از حساب کاربری با دسترسیهای کامل—مثل root—استفاده کنید. همیشه برای خطاهای مجوز در خروجی ترمینال چک کنید.
۴. استفاده نکردن از –add-drop-table حین اکسپورت
بدون فلگ --add-drop-table، ایمپورت فایل Dump به دیتابیسی که از قبل جداولی با همان نامها دارد، به خطاهایی مثل Table already exists منجر میشود. این فلگ تضمین میکند هر جدول قبل از بازسازی حذف شود:
mysqldump -u username -p --add-drop-table database_name > data-dump.sql
این بهویژه هنگام ایمپورت مجدد دادهها به محیط توسعه یا استیجینگ موجود مهم است.
۵. رد کردن مهاجرت دسترسیهای کاربر
حسابهای کاربری، نقشها و مجوزها در Dumpهای استاندارد دیتابیس گنجانده نمیشوند. اگر فراموش کنید اینها را جداگانه اکسپورت کنید، کاربران روی سرور مقصد نمیتوانند وصل شوند یا اقدامی انجام دهند. میتوانید:
- جدولهای مربوطه از دیتابیس mysql را Dump کنید (مثلاً user، db، tables_priv)
- یا دستورات GRANT را با SHOW GRANTS تولید و اعمال کنید
همیشه بعد از ایمپورت دادههای Grant، FLUSH PRIVILEGES; را برای اعمال تغییرات اجرا کنید.
۶. تأیید نکردن سازگاری Charset و Collation
سرورهای مختلف ممکن است از مجموعه کاراکترهای پیشفرض متفاوتی استفاده کنند (مثلاً latin1 در مقابل utf8mb4)؛ که به متن خراب یا ناخوانا بعد از ایمپورت منجر میشود. برای اجتناب از مسائل:
مجموعه کاراکتر و Collation را روی هر دوی سرور مبدأ و مقصد چک کنید:
SHOW CREATE DATABASE database_name;
از گزینه --default-character-set با mysqldump و mysql استفاده کنید:
mysqldump -u username -p --default-character-set=utf8mb4 database_name > dump.sql
این رمزگذاری سازگار دادههایتان بین محیطها را تضمین میکند.
۷. ایمپورت فایلهای بزرگ بدون بهینهسازی
فایلهای .sql خیلی بزرگ میتوانند زمان طولانی برای ایمپورت بخواهند و ممکن است به محدودیتهای منابع بخورند. علائم رایج شامل خطاهای out-of-memory یا تایماوتهای سرور است. برای کاهش زمان و بارِ ایمپورت:
- قبل از ایمپورت از
SET foreign_key_checks = 0وSET autocommit = 0استفاده کنید - حین اکسپورت برای جداول InnoDB از
--single-transactionاستفاده کنید - فایل را با gzip فشرده یا با دستور split تقسیم کنید
مانیتورینگ کارایی سرور حین ایمپورت هم میتواند کمک کند زودهنگام گلوگاهها را ببینید.
۸. غفلت از مجوزها یا مسیرهای فایل
مسئله ساده اما رایجی است وقتی سعی میکنید فایل .sqlای را که در مسیر تعیینشده وجود ندارد یا توسط کاربر فعلی قابل خواندن نیست ایمپورت کنید. همیشه وجود و مجوزهای فایل را چک کنید:
ls -l data-dump.sql
مطمئن شوید فایل مجوزهای خواندن درست را دارد (-rw-r--r-- یا مشابه) و هنگام اجرای دستور ایمپورت در دایرکتوری درستی هستید.
اجتناب از این اشتباهات میتواند زمان ذخیره، از دست رفتن داده را پیشگیری و روند کاری نرمتری هنگام کار با دیتابیسهای MySQL یا MariaDB تضمین کند. همیشه فرایندتان را در محیط غیر-پروداکشن قبل از اجرای ایمپورتها یا مهاجرتهای بحرانی تست کنید.
سوالات متداول
۱. تفاوت mysqldump و بکاپ باینری چیست؟
mysqldump بکاپ منطقی میسازد؛ با اکسپورت محتوای دیتابیس بهصورت دستورات SQL. قابل حمل، قابلخواندن-انسانی و برای مهاجرت داده بین سرورها یا نسخهها ایدهآل است. در مقابل، بکاپ باینری فایلهای واقعی داده روی دیسک را کپی میکند. بکاپهای باینری برای دیتاستهای بزرگ سریعترند و همهچیز (شامل دادههای غیر-SQL مثل لاگها) را شامل میشوند؛ اما به ساختار فایل و سازگاری نسخه سرور گره خوردهاند. Dumpهای منطقی برای جابهجاییهای بین-نسخه یا بین-پلتفرم امنترند؛ در حالی که بکاپهای باینری برای بازیابیهای کاملِ همان-سرور بهترند.
۲. آیا میتوانم Dump مربوط به MySQL را در MariaDB ایمپورت کنم؟
بله. MySQL و MariaDB بهطور بالایی سازگارند و فایلهای mysqldumpای ساختهشده از دیتابیس MySQL معمولاً بدون تغییر در MariaDB قابل ایمپورتاند. اما اگر Dump شامل قابلیتها یا سینتکسِ معرفیشده در نسخههای جدیدتر MySQL باشد (مثلاً توابع JSON یا تنظیمات خاص موتور ذخیرهسازی)، ممکن است لازم باشد فایل Dump را مرور و دستورات ناسازگار را قبل از ایمپورت تنظیم کنید.
۳. چطور فقط اسکیما را بدون داده اکسپورت کنم؟
برای اکسپورت فقط ساختار جدول (اسکیما) و رد کردن دادهها، از فلگ --no-data با mysqldump استفاده کنید:
mysqldump -u username -p --no-data database_name > schema_only.sql
این فایل دامپی میسازد که همه دستورات CREATE TABLE را شامل اما دستورات INSERT را حذف میکند. برای تکثیر ساختارهای دیتابیس یا تولید قالبهایی برای محیطهای توسعه مفید است.
۴. اگر حین ایمپورت خطای «table already exists» بگیرم چه؟
این خطا وقتی رخ میدهد که دیتابیس هدف از قبل جداولی با همان نامهایی که در فایل Dump هستند را در بر داشته باشد. برای رفعش چند گزینه دارید:
جداول موجود را دستی حذف یا با افزودن --add-drop-table به دستور اکسپورت، دستورات DROP TABLE IF EXISTS را در Dump بگنجانید:
mysqldump -u username -p --add-drop-table database_name > data-dump.sql
قبل از ایمپورت، دیتابیس خالی جدیدی بسازید تا از تعارض اجتناب شود.
فایل Dump را ویرایش و دستورات جدولِ متناقض را حذف کنید اگر میخواهید ردشان کنید.
همیشه قبل از ایمپورت در محیط پروداکشن، محتوای فایل Dump را مرور کنید تا مطمئن شوید شامل عملیاتهای مخربی مثل DROP TABLE یا TRUNCATE نیست.
۵. آیا میتوانم چند دیتابیس را همزمان اکسپورت کنم؟
بله. میتوانید از گزینه --databases با mysqldump بهدنبالش فهرست جداشده-با-فاصلهای از نام دیتابیسها استفاده کنید:
mysqldump -u username -p --databases db1 db2 db3 > multi-database-dump.sql
این دستور شامل دستورات CREATE DATABASE و USE به ازای هر دیتابیس میشود؛ که بازیابی بعدیشان در همان سرور یا سرور دیگری را آسانتر میکند.
۶. چطور همه دیتابیسهای سرور را اکسپورت کنم؟
برای اکسپورت هر دیتابیسی روی سرور MySQL یا MariaDB خودتان، از گزینه --all-databases استفاده کنید:
mysqldump -u root -p --all-databases > all_databases.sql
این بکاپ کاملی شامل دیتابیسهای سیستمی مثل mysql میسازد؛ که حسابهای کاربری و دسترسیها را در بر دارد. فقط برای مهاجرتهای کامل-سرور یا بازیابی از فاجعه استفادهاش کنید.
۷. آیا ایمپورت Dump در دیتابیس زنده امن است؟
ایمپورت در دیتابیس پروداکشن باید با احتیاط انجام شود. اگر Dump شامل دستورات DROP TABLE یا INSERT باشد، میتواند دادهها را بازنویسی یا تکثیر کند. برای امنیت:
- همیشه ایمپورتها را اول در محیط استیجینگ تست کنید.
- قبل از ایمپورت از دیتابیس زنده بکاپ بگیرید.
- فایل Dump را برای دستورات مخربی مثل DROP یا TRUNCATE مرور کنید.
۸. چرا ایمپورت من اینقدر طول میکشد؟
ایمپورتهای کند میتوانند بهدلیل دیتاستهای بزرگ، بررسیهای کلید خارجی فعال، بهروزرسانیهای مکرر ایندکس یا منابع ناکافی سرور باشند. برای سریعتر کردن:
- بررسیهای کلید خارجی و autocommit را غیرفعال کنید.
- حین اکسپورت از فلگهای
--quickو--single-transactionاستفاده کنید. - فایل Dump را با gzip فشرده کنید.
- در صورت امکان برای دیتاستهای خام بزرگ از LOAD DATA INFILE استفاده کنید.
نتیجهگیری
در این آموزش، یاد گرفتید چطور با mysqldump دیتابیسهای MySQL یا MariaDB را اکسپورت و ایمپورت کنید. انتقالهای کامل دیتابیس، اکسپورتهای جدول انتخابی، مهاجرت حسابهای کاربری و دسترسیها و استراتژیهایی برای کارآمد مدیریت کردن فایلهای Dump بزرگ را پوشش دادید. این تکنیکها برای بکاپها، مهاجرتهای سرور، تکثیر محیط و وظایف بازیابی ضروریاند. تسلط بر آنها کمک میکند دیتابیسهایتان را در سراسر سیستمهای توسعه و پروداکشن قابل اطمینانتر مدیریت کنید.




