امروز میخواستم یه دیتابیس رو از سرور قدیم MariaDB 10.6 به سرور جدید MySQL 8.0 منقل کنم. با دستور mysqldump از دیتابیس سرور قدیم بکاپ گرفتم و به کمک دستور scp دیتابیس رو به سرور جدید انتقال دادم، اما زمانی که میخواستم دیتابیس رو بازیابی کنم خطای Unknown command ‘\-‘ رو دریافت کردم:
ERROR at line 1: Unknown command '\-'
بعد از کمی جستجو در اینترنت متوجه شدم تیم MariaDB این تغییر رو به دلایل امنیتی انجام دادند تا از ایجاد دیتابیس dump که قابلیت اجرای دستورات shell رو داره، جلوگیری کنند. متن کامل مقاله رو میتونید اینجا بخونید.
مشکل از اونجایی شروع میشه که MariaDB یه پچ امنیتی کوچیک به سطر اول فایل dump اضافه میکنه. خطای انتقال دیتابیس دقیقا بهخاطر وجود همین سطر پیش میاومد:
/*!999999\- enable the sandbox mode */
نسخههای تحت تاثیر
طبق توضیحات مقاله بالا نسخههای 10.5.25، 10.6.18، 10.11.8، 11.0.6، 11.1.5، 11.2.4 و 11.4.2 تحت تاثیر این موضوع قرار گرفتند. بنابراین اگر از نسخههای بالا فایل dump بگیرید و بعد بخواهید به یه نسخه دیگه مثل 10.4 یا نسخههای قدیمیتر منقل کنید این مشکل بهوجود میاد.
در مورد کار من که میخواستم انتقال به MySQL 8.0 رو انجام بدم هم این مشکل وجود داشت.
راه حل رفع خطای Unknown command '\-'
در اون مقاله چند روش برای حل مشکل نوشتند که به اونها اشاره میکنم:
- انتقال فایل dump به نسخهای از MariaDB که تغییرات جدید رو پشتیبانی میکنه.
- استفاده از نسخههای قدیمیتر MariaDB برای تولید فایل dump و ایجاد بکاپ.
- حذف سطر مربوط به پچ امنیتی در هنگام ایجاد فایل dump با دستور
mariadb-dump|tail +2
. - حذف سطر پچ امنیتی در هنگام ایمپورت فایل dump به سرور جدید با دستور
tail +2|mariadb
.
البته راهحلهای بالا برای انتقال از MariaDB به MariaDB نوشته شده و برای انتقال به MySQL باید دستورات بالا به mysqldump|tail +2
و tail +2|mysql
تبدیل بشن.
من با الهام گرفتن از راهنماییهای بالا یه روش دیگر رو انجام دادم به این ترتیب که در زمان بکاپ گرفتن یا در زمان ایمپورت سطر مورد نظر رو حذف نکردم بلکه یه فایل جدید ساختم و با دستور زیر سطر مربوط به پچ امنیتی رو داخلش حذف کردم:
tail -n +2 "backup.sql" > "backup.sql.tmp" && mv "backup.sql.tmp" "backup.sql"
در دستورات بالا فایل backup.sql همون فایل dump هست که از دیتابیس سرور قدیم ساخته بودم. به کمک دستور tail
سطر اول فایل رو حذف کردم و یه فایل جدید به نام backup.sql.tmp ساختم و بعد با دستور mv
فایل جدید رو تغییر نام دادم به backup.sql. به این ترتیب خطای Unknown command ‘\-‘ رفع شد و مشکلم برای انتقال یه دیتابیس چندگیگابایتی به سرور جدید حل شد.