نصب MySQL در لینوکس بسیار متفاوت از سایر سیستم عاملها است. MySQL یک سیستم مدیریت پایگاه داده منبعباز است که معمولاً به عنوان بخشی از LAMP (Linux، Apache، MySQL، PHP/Python/Perl) استفاده میشود. MySQL یک سیستم مدیریت دیتابیس رابطهای است که با از زبان کوئری SQL یا Structured Query Language برای مدیریت دادههای خود استفاده میکند. در این مقاله از سری مطالب آموزش لینوکس هر آنچه برای نحوه نصب MySQL در Ubuntu 20.04 را نیاز دارید به همراه آموزش پیکربندی، نکات و … بیان کرده ایم و در انتهای این مقاله یک سرور حاوی MySQL فعال خواهید داشت که آماده استفاده است.
پیش نیازها برای نصب MySQL در لینوکس
یک سرور اوبونتو 20.04 با یک کاربر ادمین غیر root و یک فایروال پیکربندی شده با UFW
مرحله ۱ – نصب MySQL
در اوبونتو 20.04، میتوانید MySQL را با استفاده از مخزن بسته APT نصب کنید. بهتر است قبل از نصب فهرست پکیجهای نصب شده را در سرور خود به روزرسانی کنید:
1 | sudo apt update |
سپس بسته mysql-server را نصب کنید:
1 | sudo apt install mysql-server |
اطمینان حاصل کنید که سرور با استفاده از دستور systemctl start در حال اجرا است:
1 | sudo systemctl start mysql.service |
با استفاده از این دستورات توانستید MySLQ را نصب و راه اندازی کنید. MySQL خام بر روی سرور لینوکس شما نصب شده است و حتی هیچ رمز عبوری برای آن تعین نشده است. برای پیکربندی بیشتر و ایمن سازی MySQL ادامه مطالب را دنبال کنید.
مرحله 2 – پیکربندی MySQL
میدانیم که امنیت لینوکس یکی از مهمترین دلایل استفاده از سیستم عامل لینوکس است؛ برای حفظ این ویژگی، باید در هنگام نصب یک MySQL جدید نیز اسکریپتهای امنیتی DBMS را اجرا کنید. این اسکریپت برخی از سیستمهای کم امنیت مانند روش ورود به سیستم توسط کاربران از طریق ریموت و … را تغییر میدهد.
هشدار mysql_secure_installation
از جولای 2022، هنگام اجرای این اسکریپت بدون پیکربندی خاص، خطایی رخ میدهد. دلیل آن این است که این اسکریپت سعی میکند یک رمز عبور برای حساب روت MySQL نصب شده تعیین کند، اما به طور پیش فرض در نصب اوبونتو، این حساب برای اتصال با استفاده از رمز عبور پیکربندی نشده است.
قبل از ژوئیه 2022، این اسکریپت پس از تلاش برای تنظیم رمز عبور حساب ریشه، بیصدا با شکست مواجه میشد و همانند بقیه اعلانها ادامه میداد. با این حال پس از اجرای اینم اسکریپت برای تعین رمز عبور خطای زیر برمیگردد:
1 2 3 4 5 | ... Failed! Error: SET PASSWORD has no significance for user 'root'@'localhost' as the authentication method used doesn't store authentication data in the MySQL server. Please consider using ALTER USER instead if you want to change authentication parameters. New password: |
این خطا اسکریپت را به یک حلقه بازگشتی تبدیل میکند که فقط با بستن پنجره تریمنال میتوانید از آن خارج شوید.
از آنجایی که اسکریپت mysql_secure_installation اقدامات امنیتی بسیار مفیدی انجام میدهد همچنان توصیه میشود قبل از اجرای MySQL از آن استفاده کنید و دادههای خود را ایمن کنید. برای جلوگیری از ورود به این حلقه بازگشتی، ابتدا باید نحوه احراز هویت کاربر root در MySQL خود را تنظیم کنید.
برای انجام این کار ابتدا prompt MySQL را باز کنید:
1 | sudo mysql |
سپس دستور ALTER USER زیر را اجرا کنید تا بتوانید نحوه احراز هویت کاربر root به روش استفاده از رمز عبور تغییر دهید. دستور زیر روش احراز هویت کاربر را به mysql_native_password تغییر میدهد.
1 | ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; |
پس از انجام این تغییر، از prompt MySQL خارج شوید:
1 | Exit |
پس از آن، میتوانید اسکریپت mysql_secure_installationرا بدون مشکل اجرا کنید.
در نهایت پس از پیکربندی و استفاده از اسکریپت mysql_secure_installation میتوانید تنظیمات احراز هویت کاربر root را به حالت پیش فرض auth_socket برگردانید. برای بازگردانی روش احراز هویت کاربر root در MySQL دستور زیر را اجرا کنید:
1 | mysql -u root -p |
سپس با استفاده از این دستور روش احراز هویت خود را به حالت اولیه بازگردانید:
1 | ALTER USER 'root'@'localhost' IDENTIFIED WITH auth_socket; |
پس از این دستور میتوانید به عنوان کاربر اصلی MySQL با استفاده از دستور sudo mysql متصل شوید.
نصب و پیکربندی اسکریپت امنیتی mysql_secure_installation
ابتدا این اسکریپت امنیتی را با sudo نصب کنید:
1 | sudo mysql_secure_installation |
این اسکریپت از طریق یکسری دستورات شما را راهنمایی میکند تا گزینههای امنیتی MySQL را ایجاد و فعال کنید. در اولین درخواست از شما میپرسد که آیا میخواهید از افزونه اعتبار سنجی گذروازههای ورودی استفاده کنید یا خیر. این افزونه میتواند قدرت رمزهای عبور وارد شده را نشان دهد تا در صورت ضعیف بودن یک رمز عبور سریعاً متوجه شوید و آن را تغییر دهید.
اگر این افزونه را راه اندازی کنید هر کاربر MySQL که با یک رمز عبور جدید احراز هویت میکند باید رمزی انتخاب کند که مطابق قوانین تنظیم شده شما در این افزونه باشد. شما میتوانید از بین سه سطح رمز عبور 0 (ضعیف)، 1 (متوسط) و 2 (قوی) استفاده کنید. شماره ۲ که قویترین رمز عبور را درخواست میکند و از ایمنی بیشتری برخوردار است از کاربران میخواهد تا رمزهای عبورشان حداقل 8 کاراکتر داشته باشد و ترکیبی از اعداد، حروف بزرگ و کوچک و نویسههای خاص باشد:
1 2 3 4 5 6 7 8 9 10 11 12 13 | Securing the MySQL server deployment. Connecting to MySQL using a blank password. VALIDATE PASSWORD COMPONENT can be used to test passwords and improve security. It checks the strength of password and allows the users to set only those passwords which are secure enough. Would you like to setup VALIDATE PASSWORD component? Press y|Y for Yes, any other key for No: Y There are three levels of password validation policy: LOW Length >= 8 MEDIUM Length >= 8, numeric, mixed case, and special characters STRONG Length >= 8, numeric, mixed case, special characters and dictionary file Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2 |
صرف نظر از اینک این افزونه اختیاری را فعال میکنید یا خیر، در مرحله بعد باید یک رمز عبور برای کاربر اصلی root در MySQL تنظیم کنید. رمز عبور خود را وارد کنید و سپس تایید کنید:
1 2 3 | Please set the password for root here. New password: Re-enter new password: |
اگر از افزونه اعتبار سنجی رمز عبور استفاده کرده باشید بازخوردی در مورد رمز عبور وارد شده دریافت خواهید کرد. سپس اسکریپت از شما میپرسد که آیا میخواهید با رمزی که وارد کردهاید ادامه دهید یا میخواهید رمز جدیدی وارد کنید. با فرض اینکه از قدرت رمز عبوری که وارد کرده اید راضی هستید، Yبرای ادامه اسکریپت وارد کنید:
1 2 | Estimated strength of the password: 100 Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y |
از این به بعد میتوانید تمام سوالات بعدی را بخوانید و با وارد کردن Y آنها را بپذیرید. پیشنهاد میشود تمام سوالات را قبول کنید. با پذیرش مراحل بعد برخی از کاربران ناشناس و پایگاههای داده آزمایشی حذف خواهند شد و ورودیها به root از طریق ریموت غیرفعال خواهد شد. پس از آن این قوانین اجرا میشوند و MySQL بلافاصله با قوانین جدید سازگار میشود.
پس از تکمیل این اسکریپت، MySQL شما ایمن خواهد شد. اکنون میتوانید یک کاربر MySQL ایجاد کنید و از آن استفاده کنید.
مرحله 3 – ایجاد یک کاربر اختصاصی MySQL و اعطای امتیازات
پس از نصب، MySQL یک حساب کاربری اصلی root ایجاد میکند که میتوانید از آن برای مدیریت پایگاه داده خود استفاده کنید. به این کاربر امتیازات کامل داده شده است و میتواند کنترل کاملی روی هر پایگاه داده، جدول، کابران و … داشته باشد. به همین دلیل بهتر است از این حساب به طور کل استفاده نکنید. در این مرحله نحوه استفاده از کاربر root برای ایجاد یک کاربر جدید و اعطای دسترسیها و امتیازات به آن توضیح داده شده است.
در سیستمهای اوبونتو که MySQL 5.7 یا نسخههای بالاتر را اجرا میکنند، کاربر root به طور پیش فرض با استفاده از افزونه auth_socket و بدون استفاده از رمز عبور احراز هویت میشود. این افزونه نام کاربری سیستم عامل کلاینتی که MySQL را فراخوانی میکند را با نام کاربر MySQL مشخص شده در دستور مطابقت میدهد و اجازه احراز هویت را میدهد. بنابر این برای دسترسی به کاربر root باید mysql را با sudo فراخوانی کنید:
1 | sudo mysql |
توجه: اگر MySQL را با روش دیگری نصب کرده اید و احراز هویت رمز عبور را برای root فعال کرده اید، برای دسترسی به MySQL باید از دستور دیگری استفاده کنید. دستور زیر کلاینت MySQL شما را با امتیازات کاربر معمولی اجرا میکند و شما فقط با احراز هویت، امتیازات مدیر را در پایگاه داده به دست خواهید آورد:
1 | mysql -u root -p |
هنگامی که به MySQL دسترسی پیدا کردید میتوانید با دستور CREATE USER یک کاربر جدید ایجاد کنید.
1 | CREATE USER 'username'@'host' IDENTIFIED WITH authentication_plugin BY 'password'; |
پس از دستور CREATE USER شما باید یک نام کاربری مشخص کنید. بلافاصله با علامت یک @ نام میزبانی را که این کاربر به آن متصل میشود را وارد کنید. اگر قصد دارید فقط به این کاربر به صورت محلی از سرور اوبونتو خود دسترسی داشته باشید، میتوانید آن را localhost تنظیم کنید. قرار دادن نام کاربری و میزبان در یک نقل قول (کوتیشن ‘) همیشه ضروری نیست، اما انجام این کار میتواند به جلوگیری از خطاها کمک کند.
چندین گزینه برای انتخاب افزونه احراز هویت کاربر در اختیار دارید. افزونه auth_socket که قبلاً ذکر شد، یک افزونه راحت است و امنیت قوی را بدون نیاز به وارد کردن رمز عبور برای دسترسی به دیتابیس فراهم میکند. این افزونه از اتصال به صورت ریموت جلوگیری میکند و در زمانی که به صورت ریموت بخواهید دسترسی داشته باشید کار پیچیده خواهد شد.
اگر به دنبال جاگزین برای آن هستید مستندات MySQL توضیحات کاملی را ارائه کرده است و افزونه caching_sha2_password را برای کاربرانی که میخواهند از طریق رمز عبور احراز هویت شوند پیشنهاد کرده است.
برای ایجاد کاربرانی با افزونه caching_sha2_password دستور زیر را اجرا کنید و به جای Sammy نام کاربری و به جای password رمز عبور قوی خود را وارد کنید:
1 | CREATE USER 'sammy'@'localhost' IDENTIFIED BY 'password'; |
توجه: یک مشکل شناخته شده در برخی از نسخههای PHP وجود دارد که باعث ایجاد مشکلاتی در caching_sha2_password میشود. اگر قصد دارید از این پایگاه داده با یک برنامه PHP – به عنوان مثال phpMyAdmin – استفاده کنید، ممکن است بخواهید کاربری ایجاد کنید که با افزونه قدیمیتر mysql_native_password سازگار باشد. هرچند هنوز احراز هویت آن ایمن است. برای ایجاد این کاربر دستور زیر را اجرا کنید:
1 | CREATE USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; |
اگر از بروز این خطا مطمئن نیستید میتوانید کاربر خود را ایجاد کنید و بعداً با ALTER آن کاربر را ویرایش کنید:
1 | ALTER USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; |
اعطای امتیاز به کاربر
پس از ایجاد کاربر جدید میتوانید به آن امتیازهای لازم را اعطا کنید. سینتکس کلی اعطای امتیاز به کاربران به شکل زیر است:
1 | GRANT PRIVILEGE ON database.table TO 'username'@'host'; |
مقدار PRIVILEGE در این مثال مشخص میکند که کاربر مجاز است چه اقداماتی را در پایگاهداده و جدول مشخص شده انجام دهد. میتوانید با جدا کردن هر امتیاز با کاما، چندین امتیاز را در یک دستور به یک کاربر بدهید. همچنین میتوانید با وارد کردن ستاره (*) به جای پایگاه داده و یا نام جدول، امتیاز گلوبال را به کاربر اعطا کنید. در SQL، ستارهها کاراکترهای خاصی هستند که برای نشان دادن “همه” پایگاه دادهها یا جداول استفاده میشوند.
برای مثال، دستور زیر به کاربر امتیازات جهانی CREATE، ALTERو DROPپایگاههای داده، جداول و کاربران و همچنین امکان INSERT، UPDATEو DELETEدادهها را از هر جدولی در سرور میدهد. همچنین به کاربر این امکان را میدهد که دادهها را با کوئری SELECT کند ، کلیدهای خارجی را با REFERENCES ایجاد کند و عملیات FLUSHرا با امتیاز RELOAD انجام دهد. شما باید فقط مجوزهای مورد نیاز کاربران را به آنها اعطا کنید.
برای انجام این کار دستور GRANT را اجرا کنید و نام کاربری خود را به جای sammy قرار دهید تا بتوانید این امتیازات را به کاربر خود بدهید:
1 | GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'localhost' WITH GRANT OPTION; |
توجه داشته باشید که این دستور شامل WITH GRANT OPTION است. این آپشن به کاربر MySQL شما اجازه میدهد که تا بتواند هر گونه مجوزی را که دارد به سایر کاربران سیستم اعطا کند.
هشدار: برخی از کابران ممکن است بخواهند امتیاز ALL PRIVILEGES را به کاربران دیگر بدهند که امتیاز بسیار بزرگی همانند امتیاز کاربر اصلی root است و میتواند به تمام دیتابیسهای سرور دسترسی داشته باشد. مانند دستور زیر:
1 | GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION; |
چنین امتیازات گسترده ای نباید به سادگی اعطا شوند، زیرا هر کسی که به این کاربر MySQL دسترسی داشته باشد، کنترل کاملی بر هر پایگاه داده روی سرور خواهد داشت.
پس از اعطای امتیازات بهتر است دستور FLUSH PRIVILEGES را اجرا کنید. این دستور هر نتیجه ای که برای دستورات CREATE USER و GRANT در سرور ذخیره و کش شده اند را حذف میکند.
1 | FLUSH PRIVILEGES; |
سپس میتوانید با دستور زیر از MySQL خارج شوید:
1 | MySQL |
در آینده، برای ورود به عنوان کاربر جدید MySQL ، از دستوری مانند دستور زیر استفاده خواهید کرد:
1 | mysql -u sammy -p |
فلگ -p باعث میشود که کلاینت MySQL از شما رمز عبور کاربر MySQL را برای احراز هویت درخواست کند.
مرحله 4 – آزمایش MySQL
صرف نظر از نحوه نصب و پیکربندی آن، MySQL باید به طور خودکار اجرا میشد. برای تست این موضوع دستور زیر را اجرا کنید تا وضعیت آن را پیگیری کنید:
1 | systemctl status mysql.service |
خروجی مشابه زیر را خواهید دید:
1 2 3 4 5 6 7 8 9 | mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2020-04-21 12:56:48 UTC; 6min ago Main PID: 10382 (mysqld) Status: "Server is operational" Tasks: 39 (limit: 1137) Memory: 370.0M CGroup: /system.slice/mysql.service └─10382 /usr/sbin/mysqld |
اگر MySQL اجرا نمیشود، میتوانید آن را با دستور sudo systemctl start mysql اجرا کنید.
برای بررسی بیشتر میتوانید از ابزار mysqladmin استفاده کنید. این ابزار یک کلاینت است و به شما امکان اجرای دستورات مدیریت را میدهد. به عنوان مثال این دستور میگوید که به عنوان یک کاربر MySQL به نام sammy (-u sammy) متصل شوید، یک رمز عبور (-p) درخواست کنید و پاسخ را برگردانید. حتماً نام کاربری اختصاصی MySQL خود را تغییر دهید و پس از درخواست رمز عبور آن را وارد کنید:
1 | sudo mysqladmin -p -u sammy version |
شما باید خروجی مشابه این را ببینید:
1 2 3 4 5 6 7 8 9 10 11 | mysqladmin Ver 8.0.19-0ubuntu5 for Linux on x86_64 ((Ubuntu)) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Server version 8.0.19-0ubuntu5 Protocol version 10 Connection Localhost via UNIX socket UNIX socket /var/run/mysqld/mysqld.sock Uptime: 10 min 44 sec Threads: 2 Questions: 25 Slow queries: 0 Opens: 149 Flush tables: 3 Open tables: 69 Queries per second avg: 0.038 |
این بدان معناست که MySQL شما به درستی راه اندازی و اجرا شده است.
جمع بندی
نصب MySQL در لینوکس به تنهایی کافی نیست و بهتر است به طور کامل پیکربندی، ایمن و تست شود. در این مقاله یک سیستم MySQL کامل روی ubuntu نصب کردیم. پس از مراحل نصب نوبت به ایمن سازی با اسکریپت امنیتی mysql_secure_installation میرسد که این پایگاه داده را ایمن کردیم. در مرحله بعد هر سیستمی نیازمند به ایجاد کاربر و اعطای سطح دسترسی و امتیازات است و در نهایت مهم ترین بخشی که نصب ما را تایید میکند بخش آزمایش MySQL است که باید حتما انجام شود. البته MySQL نکات و ترفندهای بسیار زیادی دارد و پیکربندی آن به اینجا ختم نمیشود.
سوالات متداول
چگونه MySQL را از طریق خط فرمان نصب کنم؟
پس از به روزرسانی پکیج ها دستور زیر را اجرا کنید:
1 | sudo apt install mysql-server |
MySQL در کجای لینوکس نصب میشود؟
شما می توانید تمام باینری های مربوط به MySQL را در /usr/bin و /usr/sbin پیدا کنید. تمام جداول و پایگاه داده ها در پوشه /var/lib/mysql ایجاد خواهند شد.
چگونه MySQL را با فایل ZIP نصب کنیم؟
- آرشیو اصلی را در پوشه نصب مورد نظر استخراج کنید.
- نوع سرور MySQL را انتخاب کنید.
- MySQL را راه اندازی کنید.
- سرور MySQL را راه اندازی کنید.
- حساب های کاربری پیش فرض را ایمن کنید.
MySQL apt repository چیست؟
مخزن MySQL APT یک راه ساده و راحت برای نصب و به روز رسانی محصولات MySQL با جدیدترین بسته های نرم افزاری با استفاده از Apt ارائه می دهد. مخزن MySQL APT بسته های MySQL را برای توزیع های لینوکس زیر فراهم می کند:
Debian
چگونه بفهمم MySQL اوبونتو نصب شده است؟
پس از اتمام نصب، سرور MySQL باید به طور خودکار راه اندازی شود. برای مشاهده وضعیت دستور زیر را اجرا کنید:
1 | sudo service mysql status |