數(shù)據(jù)庫MySQL/MariaDB安裝與基礎(chǔ)調(diào)優(yōu)過程
一、引言:裝完就能用,但千萬別直接用
在Ubuntu上安裝MySQL只需一條命令:
sudo apt update && sudo apt install mysql-server -y
CentOS/RHEL上:
sudo dnf install mysql-server -y
安裝完成后,MySQL默認(rèn)已經(jīng)啟動(dòng)。但如果你認(rèn)為“裝完就能直接用”,那就太危險(xiǎn)了。默認(rèn)安裝的MySQL存在幾個(gè)嚴(yán)重安全隱患:
- root用戶可以無密碼登錄(部分版本)
- 存在匿名用戶,任何人都有一定權(quán)限訪問數(shù)據(jù)庫
- 存在test數(shù)據(jù)庫,所有人都能訪問
在生產(chǎn)環(huán)境中,這幾個(gè)問題中的任何一個(gè)都可能導(dǎo)致數(shù)據(jù)泄露。所以安裝后的第一步,永遠(yuǎn)是安全初始化。
二、mysql_secure_install:安全初始化
MySQL提供了一個(gè)交互式腳本mysql_secure_installation,專門用來加固初始安裝。運(yùn)行:
sudo mysql_secure_installation
腳本會(huì)依次詢問以下問題,這是最關(guān)鍵的部分,請(qǐng)仔細(xì)閱讀每一項(xiàng)的說明:
問題一:配置密碼驗(yàn)證插件
VALIDATE PASSWORD COMPONENT: Would you like to setup VALIDATE PASSWORD component?
這個(gè)插件會(huì)強(qiáng)制密碼必須滿足一定復(fù)雜度(長(zhǎng)度、大小寫、數(shù)字、特殊字符)。建議選擇Yes(輸入y)。如果這是個(gè)人學(xué)習(xí)環(huán)境、不想太復(fù)雜,也可以選No。
問題二:設(shè)置root密碼
Please set the password for root here. New password: _ Re-enter new password: _
如果系統(tǒng)沒有要求輸入初始密碼(如Ubuntu較新版本通過auth_socket而不是密碼驗(yàn)證),系統(tǒng)會(huì)直接引導(dǎo)你設(shè)置新密碼。如果提示輸入當(dāng)前密碼而你完全不知道,查看本文最后的FAQ。
問題三:刪除匿名用戶
Remove anonymous users? (Press y|Y for Yes)
必須選Yes。匿名用戶允許任何人無需賬號(hào)就能連接數(shù)據(jù)庫,是嚴(yán)重的安全漏洞。
問題四:禁止root遠(yuǎn)程登錄
Disallow root login remotely? (Press y|Y for Yes)
強(qiáng)烈建議選Yes。root只允許本地(127.0.0.1)連接,即使數(shù)據(jù)庫被暴露到公網(wǎng),攻擊者也連不上root。如果你的應(yīng)用需要遠(yuǎn)程管理數(shù)據(jù)庫,應(yīng)該創(chuàng)建專門的遠(yuǎn)程用戶而不是開放root。
問題五:刪除test數(shù)據(jù)庫
Remove test database and access to it? (Press y|Y for Yes)
選Yes。test數(shù)據(jù)庫默認(rèn)所有人可訪問,沒有任何保留價(jià)值。
問題六:重新加載權(quán)限表
Reload privilege tables now? (Press y|Y for Yes)
選Yes。讓以上所有修改立即生效。
FAQ:忘記或不知道初始root密碼怎么辦?
Ubuntu新版本(18.04+)使用auth_socket插件認(rèn)證root,在系統(tǒng)root用戶下可以免密直接登錄MySQL:
sudo mysql # 以系統(tǒng)root身份直接進(jìn)入MySQL,無需密碼
進(jìn)入后可以修改認(rèn)證方式和密碼(參見第三步)。如果這條命令無效,需要用第14篇學(xué)過的單用戶模式或--skip-grant-tables方式繞過認(rèn)證,再重置密碼。
三、用戶與權(quán)限:給誰看什么,誰又能改什么
安全初始化之后,MySQL只保留了root用戶。日常開發(fā)中,我們需要為每個(gè)應(yīng)用創(chuàng)建獨(dú)立的數(shù)據(jù)庫和用戶,并授予精確的最小權(quán)限。
3.1 登錄MySQL
sudo mysql -u root -p # 輸入安全初始化時(shí)設(shè)置的密碼
MySQL的命令需要用;結(jié)束??吹教崾痉兂?code>mysql>,就進(jìn)入了MySQL交互界面。
3.2 創(chuàng)建數(shù)據(jù)庫
-- 創(chuàng)建數(shù)據(jù)庫(字符集設(shè)置為 utf8mb4,支持emoji等4字節(jié)字符) CREATE DATABASE myapp DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
兩點(diǎn)說明:
utf8mb4是真正的UTF-8(MySQL的utf8是閹割版,只支持最多3字節(jié)字符)。任何新項(xiàng)目都應(yīng)該用utf8mb4utf8mb4_unicode_ci中的ci代表大小寫不敏感(case insensitive),適合大多數(shù)文本排序場(chǎng)景
3.3 創(chuàng)建用戶并授權(quán)
-- 創(chuàng)建用戶('用戶名'@'允許從哪里連接') CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'StrongPassword123!'; -- 授予權(quán)限(把 myapp 數(shù)據(jù)庫的所有權(quán)限授予該用戶) GRANT ALL PRIVILEGES ON myapp.* TO 'myapp_user'@'localhost'; -- 刷新權(quán)限表(讓授權(quán)立即生效) FLUSH PRIVILEGES;
@后面的主機(jī)部分決定了這個(gè)賬號(hào)從哪臺(tái)機(jī)器可以連接:
| 寫法 | 含義 | 使用場(chǎng)景 |
|---|---|---|
'user'@'localhost' | 只能從本機(jī)連接 | 應(yīng)用和數(shù)據(jù)庫在同一臺(tái)機(jī)器上 |
'user'@'192.168.1.%' | 允許特定網(wǎng)段連接 | 應(yīng)用在另一臺(tái)服務(wù)器上,需遠(yuǎn)程訪問 |
'user'@'%' | 允許任何IP連接 | 非常危險(xiǎn),盡量避免 |
權(quán)限最小化原則:不要?jiǎng)硬粍?dòng)就ALL PRIVILEGES。如果應(yīng)用只需要讀寫數(shù)據(jù),不需要修改表結(jié)構(gòu),使用:
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'myapp_user'@'localhost';
3.4 驗(yàn)證用戶
-- 查看用戶列表 SELECT user, host FROM mysql.user; -- 查看某用戶的權(quán)限 SHOW GRANTS FOR 'myapp_user'@'localhost'; -- 退出MySQL EXIT;
然后用新用戶測(cè)試連接:
mysql -u myapp_user -p -h 127.0.0.1
四、my.cnf調(diào)優(yōu):三個(gè)必須改的參數(shù)
MySQL的默認(rèn)配置面向兼容性,而不是性能。在使用MySQL之前,至少調(diào)整以下三個(gè)參數(shù)。配置文件位置:
# Ubuntu/Debian sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf # CentOS/RHEL sudo vim /etc/my.cnf.d/mysql-server.cnf
在[mysqld]段下添加或修改參數(shù),修改后重啟生效:sudo systemctl restart mysql。
4.1 innodb_buffer_pool_size:內(nèi)存的核心參數(shù)
[mysqld] innodb_buffer_pool_size = 1G
這個(gè)參數(shù)是MySQL調(diào)優(yōu)最重要的參數(shù),沒有之一。
它的作用是:InnoDB用它來緩存數(shù)據(jù)頁和索引。MySQL頻繁讀寫的數(shù)據(jù)如果都緩存在這里,查詢和寫入就是內(nèi)存速度;緩存不夠就只能頻繁讀寫磁盤,慢兩到三個(gè)數(shù)量級(jí)。
設(shè)置多大合適?
| 服務(wù)器內(nèi)存 | 建議值 | 說明 |
|---|---|---|
| 1GB | 512M | 最低建議,再小MySQL性能嚴(yán)重下降 |
| 2GB-4GB | 總內(nèi)存 × 50% | 留一半給操作系統(tǒng)和應(yīng)用程序 |
| 8GB+ | 總內(nèi)存 × 70% | 數(shù)據(jù)庫可以多吃內(nèi)存 |
| 獨(dú)服/大內(nèi)存 | 總內(nèi)存 × 80% | 上限,再多操作系統(tǒng)會(huì)換頁 |
驗(yàn)證是否生效:
-- 進(jìn)入MySQL后執(zhí)行 SELECT @@innodb_buffer_pool_size/1024/1024 AS pool_size_MB;
輸出應(yīng)該接近你設(shè)置的值。
4.2 innodb_log_file_size:寫入性能的關(guān)鍵
innodb_log_file_size = 256M
這個(gè)參數(shù)控制InnoDB的重做日志(redo log)大小。它的作用像一個(gè)“寫入緩沖區(qū)”:數(shù)據(jù)修改先記錄到重做日志,然后慢慢寫入實(shí)際數(shù)據(jù)文件。
設(shè)置過小的癥狀:頻繁的磁盤刷新,寫入性能嚴(yán)重下降。設(shè)置過大的代價(jià):崩潰恢復(fù)時(shí)間變長(zhǎng),但不會(huì)影響正常運(yùn)行。
建議值:256MB到1GB之間。對(duì)于大多數(shù)應(yīng)用,256MB是一個(gè)安全的起點(diǎn)。如果你有高并發(fā)寫入場(chǎng)景,可以調(diào)到512MB或更大。
4.3 max_connections:最大連接數(shù)
max_connections = 200
MySQL默認(rèn)最大連接數(shù)通常是151。對(duì)于Web應(yīng)用,這個(gè)值經(jīng)常不夠用——每個(gè)PHP進(jìn)程/Python線程都可能占用一個(gè)連接。如果達(dá)到上限,新請(qǐng)求會(huì)報(bào)Too many connections錯(cuò)誤。
# 查看當(dāng)前連接數(shù) mysql -u root -p -e "SHOW STATUS LIKE 'Threads_connected';"
注意:連接數(shù)不是越大越好。每個(gè)連接占用內(nèi)存(默認(rèn)約2MB),200個(gè)連接可能占400MB內(nèi)存。設(shè)置時(shí)確保:max_connections × 每個(gè)連接內(nèi)存 不會(huì)耗盡服務(wù)器內(nèi)存。
完整建議配置(2GB內(nèi)存服務(wù)器):
[mysqld] innodb_buffer_pool_size = 1G innodb_log_file_size = 256M max_connections = 200 character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
五、忘記密碼怎么辦?
如果你忘記了MySQL root密碼,可以繞過認(rèn)證重置:
# 1. 停止MySQL sudo systemctl stop mysql # 2. 跳過權(quán)限驗(yàn)證啟動(dòng) sudo mysqld_safe --skip-grant-tables & # 3. 無密碼登錄 mysql -u root # 4. 在MySQL中重置密碼 FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPassword123!'; # 5. 退出后正常啟動(dòng) sudo pkill mysqld sudo systemctl start mysql
六、本篇小結(jié)
安全初始化(必做):
sudo mysql_secure_installation
依次確認(rèn):驗(yàn)證密碼插件(按需)→ 設(shè)root密碼 → 刪匿名用戶 → 禁用root遠(yuǎn)程登錄 → 刪test數(shù)據(jù)庫 → 重載權(quán)限。
數(shù)據(jù)庫和用戶管理:
| 操作 | 命令 |
|---|---|
| 創(chuàng)建數(shù)據(jù)庫 | CREATE DATABASE dbname CHARSET utf8mb4; |
| 創(chuàng)建用戶 | CREATE USER 'user'@'host' IDENTIFIED BY 'password'; |
| 授權(quán) | GRANT ALL ON dbname.* TO 'user'@'host'; |
| 查看權(quán)限 | SHOW GRANTS FOR 'user'@'host'; |
| 生效 | FLUSH PRIVILEGES; |
核心調(diào)優(yōu)參數(shù):
| 參數(shù) | 建議值(2GB內(nèi)存) | 作用 |
|---|---|---|
innodb_buffer_pool_size | 1G | 緩存數(shù)據(jù)和索引,最重要 |
innodb_log_file_size | 256M | 寫入緩沖,影響寫性能 |
max_connections | 200 | 最大連接數(shù) |
動(dòng)手練習(xí)
# 1. (如果是新環(huán)境)運(yùn)行安全初始化 sudo mysql_secure_installation # 2. 創(chuàng)建練習(xí)數(shù)據(jù)庫和用戶 sudo mysql -u root -p
CREATE DATABASE testdb CHARSET utf8mb4; CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'TestPass123!'; GRANT SELECT, INSERT, UPDATE, DELETE ON testdb.* TO 'testuser'@'localhost'; FLUSH PRIVILEGES; EXIT;
# 3. 用新用戶連接測(cè)試 mysql -u testuser -p -h 127.0.0.1 # 在MySQL中查看自己有哪些權(quán)限 SHOW GRANTS FOR CURRENT_USER(); EXIT;
七、下篇預(yù)告
有了Web服務(wù)器(Nginx)和數(shù)據(jù)庫(MySQL),開發(fā)團(tuán)隊(duì)還需要一個(gè)地方共享文件。下一篇我們將學(xué)習(xí)搭建FTP與Samba文件共享服務(wù)——FTP適合傳統(tǒng)的文件傳輸,Samba則能讓Linux目錄直接出現(xiàn)在Windows的“網(wǎng)絡(luò)鄰居”中,拖拽上傳就像操作本地文件夾。
延伸思考:敏感數(shù)據(jù)(如密碼字段)應(yīng)該直接存儲(chǔ)在數(shù)據(jù)庫里嗎?絕對(duì)不要。即使用GRANT限制了用戶權(quán)限,數(shù)據(jù)庫文件被盜或SQL注入仍然可能暴露這些數(shù)據(jù)。正確的做法是存儲(chǔ)密碼的加鹽哈希(如bcrypt),在應(yīng)用層處理加密邏輯。數(shù)據(jù)庫只管“存”,應(yīng)用層負(fù)責(zé)“保護(hù)”。這也是縱深防御原則的一個(gè)體現(xiàn)。
到此這篇關(guān)于數(shù)據(jù)庫MySQL/MariaDB安裝與基礎(chǔ)調(diào)優(yōu)過程的文章就介紹到這了,更多相關(guān)MySQL MariaDB安裝調(diào)試內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決當(dāng)MySQL數(shù)據(jù)庫遇到Syn Flooding問題
Syn攻擊常見于應(yīng)用服務(wù)器,而數(shù)據(jù)庫服務(wù)器在內(nèi)網(wǎng)中,應(yīng)該很難碰到類似的攻擊,這篇文章主要介紹了當(dāng)MySQL數(shù)據(jù)庫遇到Syn Flooding問題 ,需要的朋友可以參考下2019-06-06
MySQL服務(wù)啟動(dòng)全平臺(tái)指南:從Windows服務(wù)、Linux systemctl到macOS的完全指南
啟動(dòng)MySQL服務(wù)的方法根據(jù)操作系統(tǒng)的不同而有很大差異,下面我將分別介紹在Windows、Linux(主流的 Systemd 系統(tǒng))和macOS上啟動(dòng) MySQL的詳細(xì)步驟,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-09-09
MySQL中Innodb的事務(wù)隔離級(jí)別和鎖的關(guān)系的講解教程
這篇文章主要介紹了MySQL中Innodb的事務(wù)隔離級(jí)別和鎖的關(guān)系講解教程,來自于美團(tuán)技術(shù)團(tuán)隊(duì)的經(jīng)驗(yàn)實(shí)際經(jīng)驗(yàn)分享,需要的朋友可以參考下2015-11-11
MySQL數(shù)據(jù)庫存儲(chǔ)引擎的應(yīng)用
存儲(chǔ)引擎是MySQL將數(shù)據(jù)存儲(chǔ)在文件系統(tǒng)中的存儲(chǔ)方式,本文主要介紹了MySQL數(shù)據(jù)庫的存儲(chǔ)引擎的應(yīng)用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03

