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

(نویسنده) | آخرین بروزرسانی: 17 شهریور 1405

اگر رمز عبور کاربر root در MySQL یا MariaDB را فراموش کرده‌اید و به سرور لینوکس دسترسی root یا sudo دارید، می‌توانید رمز را از طریق اجرای دستور --skip-grant-tables تغییر دهید. قبل از استفاده از این روش، ابتدا بررسی کنید که آیا واقعا به تغییر رمز نیاز هست یا نه. در MariaDB 10.4 و نسخه‌های جدیدتر، کاربر root@localhost در نصب‌های معمول لینوکس می‌تواند از unix_socket استفاده کند. در این حالت کاربرroot می‌تواند بدون رمز وارد MariaDB شود.

اگر هنوز برای اجرای MySQL یا MariaDB سرور مناسبی ندارید، می‌توانید از یک سرور مجازی لینوکس با دسترسی SSH استفاده کنید.

 

پیش‌نیازها

  • دسترسی SSH به سرور
  • دسترسی با کاربر root یا کاربری که بتواند از sudo استفاده کند
  • دسترسی محلی به سرویس MySQL یا MariaDB
هشدار امنیتی:
در حالت --skip-grant-tables بررسی مجوزهای دیتابیس غیرفعال می‌شود. بنابراین این حالت را فقط برای مدت کوتاهی اجرا کنید و بعد از تغییر رمز، سرویس را دوباره به حالت عادی برگردانید.

 

مرحله 1: تشخیص MySQL یا MariaDB

ابتدا مشخص کنید روی سرور از MySQL استفاده می‌کنید یا MariaDB:

mysql --version

اگر خروجی شامل کلمه MariaDB بود، مراحل مربوط به MariaDB را دنبال کنید. اگر خروجی شامل MySQL بود، مراحل MySQL را انجام دهید.

 

اگر MariaDB دارید، ابتدا sudo را امتحان کنید

در MariaDB 10.4 و نسخه‌های جدیدتر، کاربر root@localhost در نصب‌های معمول لینوکس می‌تواند از احراز هویت unix_socket استفاده کند. در این حالت لازم نیست رمز root دیتابیس را بدانید.

ابتدا این دستور را اجرا کنید:

sudo mariadb

در بعضی نصب‌ها نام کلاینت mysql است:

sudo mysql

اگر وارد محیط MariaDB شدید، نیازی به اجرای حالت --skip-grant-tables ندارید.

 

تغییر رمز root در MariaDB

اگر می‌خواهید root بتواند با رمز عبور وارد MariaDB شود، باید روش احراز هویت این حساب را تغییر دهید.

ALTER USER 'root'@'localhost'
IDENTIFIED VIA mysql_native_password USING PASSWORD('NewStrongPassword');

به جای NewStrongPassword رمز مورد نظر خود را قرار دهید.

سپس از محیط MariaDB خارج شوید:

EXIT;

پس می‌توانید با رمز جدید اتصال را بررسی کنید:

mariadb -u root -p

اگر ورود با رمز برای برنامه یا اسکریپتی انجام می‌شود، بهتر است به جای استفاده از حساب root ، یک کاربر اختصاصی با دسترسی مورد نیاز همان برنامه ایجاد کنید و برای امنیت از کاربر root استفاده نکنید.

 

اگر رمز MariaDB را فراموش کرده‌اید

اگر sudo mariadb یا sudo mysql کار نمی‌کند و رمز root را هم در اختیار ندارید، می‌توانید MariaDB را موقتا با --skip-grant-tables اجرا کنید.

 

1. توقف MariaDB

sudo systemctl stop mariadb

 

2. اجرای MariaDB با skip-grant-tables

MariaDB را به صورت موقت با غیرفعال کردن بررسی دسترسی و شبکه اجرا کنید:

sudo mariadbd --skip-grant-tables --skip-networking &

گزینه --skip-grant-tables بررسی مجوزها را غیرفعال می‌کند و گزینه --skip-networking مانع اتصال از طریق شبکه می‌شود.

اگر اجرای mariadbd با خطا مواجه شد، ابتدا مسیر فایل اجرایی و تنظیمات سرویس نصب‌شده را بررسی کنید. در نصب‌های مختلف ممکن است مسیر فایل‌ها متفاوت باشد.

 

3. ورود به MariaDB بدون رمز

sudo mariadb

چون MariaDB با --skip-grant-tables اجرا شده است، در این مرحله بررسی رمز و مجوزهای حساب انجام نمی‌شود.

 

4. فعال کردن دوباره جداول دسترسی

داخل محیط MariaDB دستور زیر را اجرا کنید:

FLUSH PRIVILEGES;

اجرای این دستور لازم است تا دستورات مدیریت حساب مانند ALTER USER دوباره قابل استفاده باشند.

 

5. تعیین رمز جدید

برای فعال کردن ورود با رمز عبور برای root@localhost از دستور زیر استفاده کنید:

ALTER USER 'root'@'localhost'
IDENTIFIED VIA mysql_native_password USING PASSWORD('NewStrongPassword');

مقدار NewStrongPassword را با یک رمز عبور قوی جایگزین کنید.

سپس از MariaDB خارج شوید:

EXIT;

 

6. توقف MariaDB در حالت موقت

چون MariaDB را به صورت دستی اجرا کرده‌اید، ابتدا شماره پردازش مربوط به آن را پیدا کنید:

pgrep -a mariadbd

PID مربوط به همان پردازشی را که در مرحله قبل اجرا کرده‌اید پیدا کنید و آن را متوقف کنید:

sudo kill PID

شماره PID مربوطه را پیدا کرده و در دستور بالا قرار دهید.

 

7. راه‌اندازی عادی MariaDB

sudo systemctl start mariadb

 

8. تست رمز جدید

mariadb -u root -p

رمز جدید را وارد کنید. اگر وارد محیط MariaDB شدید، تغییر رمز با موفقیت انجام شده است.

 

ریست رمز MySQL در لینوکس

اگر رمز root@localhost در MySQL را فراموش کرده‌اید و امکان ورود معمولی به دیتابیس وجود ندارد، می‌توانید MySQL را موقتا بدون بررسی جدول دسترسی اجرا کنید و سپس رمز جدید تعیین کنید.

 

1. توقف MySQL

sudo systemctl stop mysql

 

2. اجرای MySQL با skip-grant-tables

MySQL را به صورت موقت با گزینه‌های --skip-grant-tables و --skip-networking اجرا کنید:

sudo mysqld_safe --skip-grant-tables --skip-networking &

در این حالت MySQL بررسی حساب‌ها و مجوزها را متوقف می‌کند و به دلیل --skip-networking اتصال‌های شبکه را نمی‌پذیرد.

 

3. ورود به MySQL بدون رمز

sudo mysql

در این مرحله نباید رمز عبور از شما خواسته شود.

 

4. فعال کردن دوباره سیستم دسترسی

داخل MySQL دستور زیر را اجرا کنید:

FLUSH PRIVILEGES;

بعد از اجرای FLUSH PRIVILEGES، دستورات مدیریت حساب مانند ALTER USER دوباره قابل استفاده هستند.

 

5. تعیین رمز جدید

برای تغییر رمز root@localhost از دستور زیر استفاده کنید:

ALTER USER 'root'@'localhost'
IDENTIFIED BY 'NewStrongPassword';

مقدار NewStrongPassword را با رمز جدید جایگزین کنید.

در MySQL نیازی نیست برای تغییر رمز، روش احراز هویت را به صورت دستی روی mysql_native_password تنظیم کنید. استفاده از IDENTIFIED BY باعث می‌شود رمز حساب تغییر کند و روش احراز هویت پیش‌فرض نصب حفظ شود.

 

6. خروج از MySQL

EXIT;

 

7. توقف MySQL که به صورت دستی اجرا شده است

ابتدا پردازش MySQL را پیدا کنید:

pgrep -a mysqld

PID مربوط به نمونه‌ای را که برای ریست رمز اجرا کرده‌اید پیدا کنید و همان پردازش را متوقف کنید:

sudo kill PID

مقدار PID را با شماره پردازش واقعی جایگزین کنید.

 

8. راه‌اندازی عادی MySQL

sudo systemctl start mysql

 

9. تست رمز جدید

mysql -u root -p

رمز جدید را وارد کنید. اگر وارد محیط MySQL شدید، رمز با موفقیت تغییر کرده است.

 

اگر دستور ALTER USER خطا داد

اگر MySQL یا MariaDB را با --skip-grant-tables اجرا کرده‌اید و ALTER USER با خطا مواجه می‌شود، ابتدا مطمئن شوید این دستور را اجرا کرده‌اید:

FLUSH PRIVILEGES;

اگر خطا همچنان وجود دارد، نسخه دیتابیس را بررسی کنید:

SELECT VERSION();

سپس حساب‌های root موجود را بررسی کنید:

SELECT User, Host
FROM mysql.user
WHERE User = 'root';

ممکن است حساب root با host دیگری ایجاد شده باشد. برای مثال اگر خروجی شامل root@127.0.0.1 بود، باید همان host را در دستور ALTER USER استفاده کنید:

ALTER USER 'root'@'127.0.0.1'
IDENTIFIED BY 'NewStrongPassword';

 

اگر sudo mariadb کار می‌کند ولی ورود با رمز ممکن نیست

اگر این دستور بدون درخواست رمز وارد MariaDB می‌شود:

sudo mariadb

اما این دستور کار نمی‌کند:

mariadb -u root -p

به احتمالا بالا root@localhost از unix_socket برای احراز هویت استفاده می‌کند.

اگر مدیریت دیتابیس را فقط از طریق کاربر root سیستم انجام می‌دهید، نیازی به تغییر این تنظیم ندارید و می‌توانید از همان روش استفاده کنید:

sudo mariadb

اگر یک برنامه یا اسکریپت به ورود با نام کاربری و رمز عبور نیاز دارد، بهتر است برای آن یک حساب جداگانه ایجاد کنید و فقط دسترسی‌های مورد نیاز برنامه را به آن بدهید.

 

تغییر رمز کاربر عادی MySQL یا MariaDB

اگر رمز یک کاربر عادی را می‌خواهید تغییر دهید و با حسابی وارد شده‌اید که مجوز مدیریت آن کاربر را دارد، نیازی به --skip-grant-tables نیست.

در MySQL:

ALTER USER 'username'@'localhost'
IDENTIFIED BY 'NewStrongPassword';

در MariaDB:

ALTER USER 'username'@'localhost'
IDENTIFIED BY 'NewStrongPassword';

اگر host کاربر localhost نیست، مقدار صحیح host را جایگزین کنید.

 

خطاهای رایج

خطا یا وضعیتکاری که باید انجام دهید
Access denied for user 'root'اگر رمز root را فراموش کرده‌اید، سرویس را با --skip-grant-tables اجرا کنید و رمز جدید تعیین کنید.
ALTER USER در حالت skip-grant-tables اجرا نمی‌شودابتدا داخل MySQL یا MariaDB دستور FLUSH PRIVILEGES; را اجرا کنید.
sudo mariadb کار می‌کند ولی mariadb -u root -p کار نمی‌کندممکن است root از unix_socket استفاده کند. اگر همین روش برای مدیریت دیتابیس کافی است، نیازی به تغییر رمز نیست.
Can't connect to local serverوضعیت سرویس را بررسی کنید و مطمئن شوید MySQL یا MariaDB در حال اجرا است.
بعد از تغییر رمز نمی‌توانم وارد شومبررسی کنید نمونه‌ای که با --skip-grant-tables اجرا شده متوقف شده باشد و سرویس اصلی را با systemctl start اجرا کرده باشید.

 

بررسی وضعیت سرویس بعد از تغییر رمز

برای MySQL:

sudo systemctl status mysql

برای MariaDB:

sudo systemctl status mariadb

در صورتی که سرویس به درستی اجرا شده باشد، وضعیت آن باید active (running) باشد.

 

اگر برای مدیریت دیتابیس به یک محیط لینوکس با دسترسی SSH نیاز دارید، می‌توانید از پلن های vps استفاده کنید یا مستقیما vps لینوکس تهیه کنید. دسترسی root یا sudo به شما اجازه می‌دهد سرویس MySQL یا MariaDB را مدیریت و در صورت نیاز رمز کاربران دیتابیس را تغییر دهید.



نویسنده: ایرج زاهدی، بنیان‌گذار و معمار فنی بلوسرور. محتوای این مقالات بر پایه تجربه عملی در طراحی، پیاده‌سازی و مدیریت پروژه‌های متنوع میزبانی وب در ایران و خارج از کشور، در طول بیش از یک دهه فعالیت مداوم نوشته شده است. به عنوان متخصص در بهینه‌سازی عملکرد و عیب‌یابی سیستم‌های هاستینگ (از VPS تا هاست اشتراکی)، هدف من به اشتراک‌گذاری تجربیات و راهکارهای فنی است؛ همان دانشی که امروز ستون اصلی پایداری و کیفیت در سرویس‌های بلوسرور محسوب می‌شود.