نصب MySQL روی اوبونتو و امن سازی پایه

برای نصب MySQL روی اوبونتو بسته mysql-server را با apt نصب کنید، با mysql_secure_installation تنظیمات امنیتی پایه را اعمال کنید و بعد برای هر برنامه یک دیتابیس و یک کاربر جدا بسازید. به‌طور پیش‌فرض MySQL فقط به آدرس 127.0.0.1 گوش می‌دهد، یعنی از بیرون سرور در دسترس نیست، و این تنظیم را بدون دلیل عوض نکنید.

این راهنما برای Ubuntu 22.04 و 24.04 و MySQL 8 است. اگر MariaDB می‌خواهید، دستورها تقریباً مشابه‌اند و تفاوت‌ها در بخش جدایی آمده است. بکاپ‌گیری و بازیابی در بکاپ گرفتن از دیتابیس MySQL جداگانه توضیح داده شده است.

نصب MySQL روی اوبونتو: مرحله اول

sudo apt update
sudo apt install mysql-server

وضعیت سرویس و نسخه را ببینید:

sudo systemctl status mysql
mysql --version

نصب بسته معمولاً خودکار سرویس را روشن و برای بالا آمدن بعد از ری‌استارت فعال می‌کند.

مرحله دوم: ورود به MySQL با کاربر root

در Ubuntu، حساب root در MySQL با روش auth_socket احراز هویت می‌شود، یعنی رمز ندارد و فقط کاربر root سیستم‌عامل، با sudo، می‌تواند وارد شود:

sudo mysql

اگر برنامه‌ای مستقیم با کاربر root به MySQL وصل می‌شود، باید به‌جای آن کاربر جدا بسازید؛ استفاده از root برای برنامه‌ها نادرست است.

مرحله سوم: امن‌سازی پایه

sudo mysql_secure_installation

این ابزار چند سؤال می‌پرسد: فعال کردن اعتبارسنج رمز (VALIDATE PASSWORD)، حذف کاربران ناشناس، بستن ورود root از راه دور و حذف دیتابیس آزمایشی test. در یک سرور تولیدی به همه سؤال‌ها جز اعتبارسنج رمز، که انتخابی است، پاسخ بله بدهید. اگر اعتبارسنج را روشن کنید، رمزهایی که ساده باشند رد می‌شوند.

مرحله چهارم: ساخت دیتابیس و کاربر

برای هر برنامه یک دیتابیس و یک کاربر مخصوص بسازید که فقط به همان دیتابیس دسترسی داشته باشد. نام‌ها و رمز را در مثال عوض کنید:

CREATE DATABASE shopdb CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
CREATE USER 'shopuser'@'localhost' IDENTIFIED BY 'STRONG_PASSWORD';
GRANT ALL PRIVILEGES ON shopdb.* TO 'shopuser'@'localhost';
FLUSH PRIVILEGES;

مجموعه کاراکتر utf8mb4 فارسی و emoji را درست ذخیره می‌کند. اگر برنامه‌ای روی همان سرور نباشد و از ماشین دیگر وصل شود، نام میزبان را در دستور CREATE USER با آدرس همان ماشین جایگزین کنید، نه علامت درصد که از همه آدرس‌ها اجازه می‌دهد.

با کاربر جدید امتحان کنید:

mysql -u shopuser -p shopdb

بررسی اتصال از بیرون

آدرسی که MySQL روی آن گوش می‌دهد را ببینید:

sudo ss -ltnp | grep 3306

اگر خروجی 127.0.0.1:3306 است، دیتابیس فقط از خود سرور در دسترس است و برای سایتی که روی همان سرور اجرا می‌شود، معمولاً همین حالت درست است. اگر باید از ماشین دیگری وصل شوید، bind-address را در فایل /etc/mysql/mysql.conf.d/mysqld.cnf عوض و فقط پورت 3306 را برای IP همان ماشین در فایروال باز کنید. پورت دیتابیس را برای همه باز نگذارید. روش بستن پورت‌ها با فایروال در فایروال UFW در اوبونتو آمده است.

تنظیمات مهم حافظه

مهم‌ترین تنظیم عملکرد MySQL، اندازه buffer pool در InnoDB است که مقدار داده و ایندکسی را که در حافظه نگه می‌دارد تعیین می‌کند. مقدار پیش‌فرض کوچک است (۱۲۸ مگابایت). در سروری که فقط دیتابیس را اجرا می‌کند، معمولاً بخش بزرگی از حافظه، مثلاً ۵۰ تا ۷۰ درصد، به آن داده می‌شود؛ در سروری که وب‌سرور و PHP هم دارد، باید کمتر باشد. در فایل /etc/mysql/mysql.conf.d/mysqld.cnf زیر بخش [mysqld]:

innodb_buffer_pool_size = 1G

بعد از تغییر، سرویس را ری‌استارت کنید: sudo systemctl restart mysql. اندازه درست به داده و حافظه سرور بستگی دارد و این عدد فقط نمونه است. پیش از بالا بردنش، حافظه آزاد را ببینید؛ دستورهای بررسی در دستورات مانیتورینگ سرور لینوکس آمده است.

لاگ‌ها و کوئری‌های کند

sudo tail -f /var/log/mysql/error.log

برای پیدا کردن کوئری‌های کند، slow query log را روشن کنید. در همان فایل کانفیگ:

slow_query_log = 1
long_query_time = 2

کوئری‌هایی که بیشتر از ۲ ثانیه طول بکشند ثبت می‌شوند. این لاگ اولین ابزار برای فهمیدن اینکه چرا سایت کند شده است.

MariaDB به‌جای MySQL

sudo apt install mariadb-server
sudo mariadb-secure-installation

ساخت دیتابیس و کاربر با همان دستورهای SQL انجام می‌شود. تفاوت‌های جزئی، مثل نام فایل‌های کانفیگ (/etc/mysql/mariadb.conf.d/) و مجموعه مرتب‌سازی پیش‌فرض، را در نظر بگیرید. در MariaDB دستورهای mysqldump با نام mariadb-dump هم در دسترس‌اند.

وردپرس و MySQL

برای وردپرس، اطلاعات دیتابیس و کاربر ساخته‌شده را در wp-config.php می‌نویسید. اگر سایت را از هاست دیگری منتقل می‌کنید، فهرست کامل مراحل در انتقال سایت وردپرس به هاست جدید آمده است.

خطاهای رایج

نشانهعلت و راه حل
Access denied for user 'root'@'localhost'root با auth_socket کار می‌کند؛ با sudo mysql وارد شوید
ERROR 1698 برنامه نمی‌تواند با root وصل شودبرای برنامه کاربر جدا بسازید
Can't connect to local MySQL server through socketسرویس خاموش است؛ systemctl status mysql و لاگ خطا را ببینید
Too many connectionsسقف max_connections پر شده یا برنامه اتصال‌ها را نمی‌بندد
بعد از تغییر کانفیگ سرویس بالا نمی‌آیدخطای نگارشی در کانفیگ؛ لاگ journalctl -u mysql را بخوانید

سوالات متداول

MySQL بهتر است یا MariaDB؟

برای بیشتر سایت‌ها و برنامه‌ها هر دو جواب می‌دهند و با هم سازگارند. MariaDB فورک MySQL است و در بعضی توزیع‌ها پیش‌فرض است. برنامه‌هایی که ویژگی خاص MySQL 8 را می‌خواهند، مثل بعضی ویژگی‌های JSON، را باید جداگانه بررسی کنید.

رمز root را فراموش کرده‌ام؛ چه کنم؟

روی Ubuntu root با sudo وارد می‌شود و رمز ندارد. اگر رمز برای کاربری دیگر را فراموش کرده‌اید، با sudo mysql وارد شوید و با ALTER USER رمز را عوض کنید.

نصب MySQL روی اوبونتو را روی سرور جدا انجام دهیم؟

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

مجموعه کاراکتر مناسب برای فارسی کدام است؟

utf8mb4. نسخه قدیمی utf8 در MySQL فقط سه بایت از هر کاراکتر را نگه می‌دارد و بعضی نمادها را درست ذخیره نمی‌کند.

منابع