بازگشت به مجله
پایگاه دادهتیم فنی هایوهاست۹ دقیقه مطالعه

بازیابی رمز عبور root در MySQL و MariaDB

دو روش برای بازگرداندن دسترسی؛ یکی سریع و پرخطر و دیگری تمیز و امن. به همراه تفاوت هایی که در مریادی بی باید بدانید.

بازیابی دسترسی

گم شدن رمز کاربر root پایگاه داده یکی از آن موقعیت هایی است که همیشه در بدترین زمان ممکن پیش می آید. خبر خوب این است که با دسترسی مدیریتی به خود سرور، بازیابی آن کاملا شدنی است. اما روشی که در بیشتر راهنماها معرفی میشود یک بازه خطرناک ایجاد میکند که میشود از آن اجتناب کرد.

1

اول مطمئن شوید واقعا به رمز نیاز دارید

قبل از هر کاری این را امتحان کنید. در نسخه های امروزی اوبونتو و دبیان، کاربر root پایگاه داده معمولا با سوکت سیستمی احراز هویت میشود نه با رمز عبور. یعنی ممکن است اصلا رمزی لازم نباشد و شما بیهوده دنبال آن بگردید.

اگر این دستور شما را وارد کنسول کرد، مشکلی وجود ندارد و میتوانید مستقیم رمز را تغییر دهید.

تلاش برای ورود بدون رمز
sudo mysql
اگر وارد شدید، تغییر رمز به همین سادگی است
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new-strong-password';
FLUSH PRIVILEGES;
2

تشخیص موتور و نسخه

مسیر ادامه کار بسته به اینکه MySQL دارید یا مریادی بی متفاوت است. نام سرویس هم ممکن است mysql یا mariadb باشد. این دو مورد را قبل از شروع مشخص کنید.

بررسی موتور و سرویس
mysql --version
systemctl list-units --type=service | grep -E 'mysql|mariadb'
3

روش پیشنهادی: استفاده از فایل راه اندازی

در این روش دستور تغییر رمز را در یک فایل مینویسیم و سرویس را طوری بالا می آوریم که هنگام راه اندازی آن را اجرا کند. مزیت مهمش این است که در هیچ لحظه ای پایگاه داده بدون کنترل دسترسی اجرا نمیشود.

فایل را در مسیری بگذارید که سرویس اجازه خواندن آن را دارد و مالکیتش را درست تنظیم کنید.

توقف سرویس
sudo systemctl stop mysql
ساخت فایل دستور
sudo nano /var/lib/mysql-files/reset.sql
محتوای فایل
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new-strong-password';
تنظیم مالکیت و اجرای سرویس با فایل راه اندازی
sudo chown mysql:mysql /var/lib/mysql-files/reset.sql
sudo systemctl set-environment MYSQLD_OPTS="--init-file=/var/lib/mysql-files/reset.sql"
sudo systemctl start mysql
پاک سازی بعد از موفقیت
sudo systemctl unset-environment MYSQLD_OPTS
sudo systemctl restart mysql
sudo rm /var/lib/mysql-files/reset.sql
4

روش دوم و خطری که باید بشناسید

روش رایج تر این است که سرویس را با گزینه نادیده گرفتن جدول دسترسی ها اجرا کنید. در این حالت هر کسی که بتواند به پایگاه داده وصل شود، بدون هیچ رمزی دسترسی کامل دارد. به همین دلیل باید حتما شبکه را هم غیرفعال کنید تا این پنجره فقط از روی خود سرور باز باشد.

اگر گزینه غیرفعال کردن شبکه را فراموش کنید، برای چند دقیقه یک پایگاه داده کاملا باز روی اینترنت خواهید داشت. این اشتباه بیشتر از آنچه فکر کنید تکرار میشود.

اجرای سرویس در حالت بدون کنترل دسترسی
sudo systemctl stop mysql
sudo systemctl set-environment MYSQLD_OPTS="--skip-grant-tables --skip-networking"
sudo systemctl start mysql
ورود و تغییر رمز
sudo mysql
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new-strong-password';
بازگرداندن سرویس به حالت عادی
sudo systemctl unset-environment MYSQLD_OPTS
sudo systemctl restart mysql
  • دستور FLUSH PRIVILEGES قبل از تغییر رمز الزامی است.
  • بدون آن، دستور تغییر رمز با خطا روبرو میشود.
  • بعد از پایان کار حتما سرویس را به حالت عادی برگردانید.
5

تفاوت های مریادی بی

در مریادی بی، کاربر root معمولا با افزونه unix_socket کار میکند. یعنی حتی بعد از تعیین رمز، ورود همچنان بر اساس کاربر سیستمی انجام میشود. اگر میخواهید با رمز وارد شوید، باید روش احراز هویت را هم تغییر دهید.

در نسخه های قدیمی تر که دستور ALTER USER پشتیبانی نمیشود، از شکل قدیمی تعیین رمز استفاده کنید.

تغییر روش احراز هویت در مریادی بی
ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('new-strong-password');
FLUSH PRIVILEGES;
شکل قدیمی برای نسخه های خیلی قدیمی
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new-strong-password');
6

بعد از بازیابی

وقتی دسترسی برگشت، چند دقیقه وقت بگذارید تا این اتفاق دوباره تکرار نشود. رمز جدید را در یک مدیر رمز عبور ذخیره کنید نه در یک فایل متنی روی همان سرور.

  • ورود موفق با رمز جدید را قبل از بستن ترمینال تست کنید.
  • فایل حاوی رمز را حتما حذف کنید؛ رمز در آن به صورت متن ساده است.
  • تاریخچه دستورهای پوسته را بررسی کنید تا رمز در آن باقی نمانده باشد.
  • برای برنامه ها کاربر جداگانه بسازید تا نبود رمز root سرویس را متوقف نکند.

پرسش های پرتکرار

امن ترین روش بازیابی رمز root کدام است؟

استفاده از فایل راه اندازی. در این روش پایگاه داده در هیچ لحظه ای بدون کنترل دسترسی اجرا نمیشود، برخلاف روش skip-grant-tables که یک بازه باز ایجاد میکند.

چرا هنگام تغییر رمز خطای دسترسی میگیرم؟

در حالت skip-grant-tables باید ابتدا دستور FLUSH PRIVILEGES را اجرا کنید و سپس رمز را تغییر دهید. بدون آن دستور تغییر رمز با خطا روبرو میشود.

در مریادی بی چرا بعد از تعیین رمز باز هم بدون رمز وارد میشوم؟

چون کاربر root با افزونه unix_socket کار میکند و ورود بر اساس کاربر سیستمی انجام میشود. برای ورود با رمز باید روش احراز هویت را هم تغییر دهید.

به راهنمای بیشتری نیاز دارید؟

تیم پشتیبانی هایوهاست برای انتخاب و مدیریت سرویس کنار شماست.

گفتگو با پشتیبانی

ادامه یادگیری

مشاهده همه