一、環境準備
硬件配置 | |
CPU | 2 核 CPU |
內存 | 2 GB 內存 |
硬盤 | 30 GB 硬盤容量 |
外網訪問 | 服務器可以訪問外網 |
軟件環境 | |
操作系統 | Anolis OS 7.9 |
MySQL版本 | 8.4.3 |
二、服務器清單
Master | 192.168.153.221 |
---|
Node | 192.168.153.222 |
三、安裝mysql (兩臺機器都要下載)
# 下載 MySQL 8.4 社區版本的 RPM 包
wget https://repo.mysql.com//mysql84-community-release-el7-1.noarch.rpm
# 安裝下載的 RPM 包
sudo rpm -ivh mysql84-community-release-el7-1.noarch.rpm
# 更新 YUM 緩存
sudo yum makecache
# 列出所有可用的 MySQL 相關軟件包
yum list available | grep mysql
# 安裝 MySQL 社區服務器
sudo yum install -y mysql-community-server mysql-community-client
# 啟動 MySQL 服務
systemctl start mysqld
# 檢查 MySQL 服務的狀態
systemctl status mysqld
# 設置 MySQL 服務開機自啟
systemctl enable mysqld
# 從日志文件中提取臨時密碼
grep 'temporary password' /var/log/mysqld.log
# 查看 MySQL 版本信息
mysql --version
# 使用 root 用戶登錄 MySQL(需要輸入臨時密碼)
mysql -u root -p
# 修改 root 用戶的密碼為 '新密碼'
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密碼';
# 退出 MySQL 命令行界面
exit
#命令快捷版
wget https://repo.mysql.com//mysql84-community-release-el7-1.noarch.rpm
sudo rpm -ivh mysql84-community-release-el7-1.noarch.rpm
sudo yum makecache
sudo yum install -y mysql-community-server mysql-community-client
systemctl start mysqld
systemctl status mysqld
systemctl enable mysqld
grep 'temporary password' /var/log/mysqld.log
mysql --version
mysql -u root -p
四、使用navicat連接
#關閉防火墻
systemctl stop firewalld
systemctl disable firewalld
# 關閉selinux
# 臨時
setenforce 0
# 永久 注意需要重啟才能生效。
sed -i 's/enforcing/disabled/' /etc/selinux/config #使用navicat連接1103報錯
use mysql;
update user set host='%' where user='root';
flush privileges;
exit
五、建庫、建表、插入數據(在master節點上面)
-- 創建數據庫
CREATE DATABASE my_database;-- 進入創建的數據庫
USE my_database;-- 創建表1
CREATE TABLE people (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL,gender ENUM('Male', 'Female', 'Other') NOT NULL,age INT NOT NULL,hobbies VARCHAR(255)
);-- 插入數據
INSERT INTO people (name, gender, age, hobbies) VALUES
('Alice', 'Female', 30, '閱讀, 徒步'),
('Bob', 'Male', 25, '游戲, 烹飪'),
('Charlie', 'Male', 28, '運動, 旅行'),
('Diana', 'Female', 22, '音樂, 舞蹈');-- 創建表2
CREATE TABLE gao (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL,gender ENUM('男', '女') NOT NULL,age INT NOT NULL,hobbies VARCHAR(255)
);-- 插入數據到表 gao
INSERT INTO gao (name, gender, age, hobbies) VALUES
('關羽', '男', 30, '閱讀, 徒步'),
('張飛', '男', 25, '游戲, 烹飪'),
('馬超', '男', 28, '運動, 旅行'),
('趙云', '男', 22, '音樂, 舞槍'),
('黃忠', '男', 57, '騎馬, 射箭'),
('小喬', '女', 18, '彈琴, 跳舞');-- 查詢表中的數據
SELECT * FROM gao;
select * from people;
-- 刪除表
DROP TABLE gao;
六、開始部署主從復制
1、把數據庫復制到從庫,數據庫默認文件位置 /var/lib/mysql/ 先在(Node節點)從庫,創建數據庫
-- 創建數據庫
CREATE DATABASE my_database;
-- 進入創建的數據庫
USE my_database;
使用navicat工具在主庫導出表的數據,sql文件。
然后在從庫表的位置,運行主庫導出的SQL文件,確保從庫和主庫數據庫和表結構保持一致。2、修改主庫的配置文件主服務器(master)
編輯主庫的 MySQL 配置文件(通常是 /etc/my.cnf 或 /etc/mysql/my.cnf,具體路徑根據系統環境不同而不同):vim /etc/my.cnf[mysqld]
server-id = 1 # 設置唯一的server-id
log-bin = mysql-bin # 啟用二進制日志
binlog-do-db = my_database # 只記錄my_database數據庫的變更3、重啟主庫 MySQL 服務
修改配置后,重啟主庫的 MySQL 服務使配置生效:sudo systemctl restart mysqld4、在從服務器(node節點上面)
編輯 /etc/my.cnf 文件,添加或修改以下內容:vim /etc/my.cnf[mysqld]
server-id = 2 # 設置唯一的server-id,不同于主服務器
relay-log = relay-log # 啟用中繼日志重啟 MySQL 服務:sudo systemctl restart mysqld5、查看實際的二進制日志文件名(在主服務器Master節點上面)SHOW BINARY LOGS;
#出現以下結果 記住 Log_name 和 File_size 的數值。
mysql> SHOW BINARY LOGS;
+------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+------------------+-----------+-----------+
| mysql-bin.000001 | 158 | No |
+------------------+-----------+-----------+
1 row in set (0.00 sec)6、執行sql對復制進行設置,在從服務器(node節點上面)
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.153.221',
SOURCE_USER='root',
SOURCE_PASSWORD='新密碼',
SOURCE_PORT=3306,
SOURCE_LOG_FILE='mysql-bin.000001',
SOURCE_LOG_POS=158,
SOURCE_SSL=1;
#注釋
CHANGE REPLICATION SOURCE TOSOURCE_HOST='主庫ip', -- 主庫的 IP 地址或主機名,指定主服務器的位置SOURCE_USER='主庫上復制用戶', -- 主庫上用于復制的用戶,通常是具有 REPLICATION SLAVE 權限的用戶SOURCE_PASSWORD='主庫上復制用戶的密碼', -- 主庫上復制用戶的密碼,必須與創建復制用戶時設置的密碼匹配SOURCE_PORT=3306, -- 主庫的 MySQL 服務端口,通常為 3306,除非主庫使用了自定義端口SOURCE_LOG_FILE='mysql-bin.000001', -- 主庫的二進制日志文件名,指定從哪里開始復制。可以通過 SHOW MASTER STATUS 獲取SOURCE_LOG_POS=158, -- 主庫的二進制日志位置,指定從哪個位置開始讀取日志,可以通過 SHOW MASTER STATUS 獲取SOURCE_SSL=1; -- 啟用 SSL 加密連接。1 表示啟用 SSL,0 表示禁用。如果主庫啟用了 SSL,應該設置為 1#啟動復制,在從服務器(node節點上面)
START replica;
#查看復制狀態,在從服務器(node節點上面)
SHOW REPLICA STATUS\G
#復制正常運行,Replica_IO_Running 和 Replica_SQL_Running 都是 "Yes"。
?出現以下結果表示成功。

七、測試復制
--使用navicat工具,在主庫節點執行命令 查看從庫狀態是否同步。
-- 查詢表中的數據
SELECT * FROM gao;
select * from people;-- 插入數據
INSERT INTO gao (name, gender, age, hobbies) VALUES
('大喬', '女', 26, '讀書, 跑步')-- 刪除數據
delete from gao where name='黃忠'-- 更新數據
UPDATE gao SET age = '30' WHERE name = '趙云';
八、mysql 運維筆記
1、備份還原
-- 備份還原,數據庫默認文件位置 /var/lib/mysql/
cd /var/lib/mysql/
#備份:
mysqldump -u root -p my_database > bf.sql
#還原:
#方法1:
mysql -u root -p -e "CREATE DATABASE my_database;"
mysql -u root -p my_database < bf.sql
#方法2:
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS my_database; USE my_database; SOURCE bf.sql;"
注釋:
方法1:
mysql -u root -p -e "CREATE DATABASE my_database;"
mysql -u root -p my_database < bf.sql
命令作用:
第一條命令創建一個名為 my_database 的數據庫。
第二條命令將 bf.sql 文件中的 SQL 語句導入到 my_database 數據庫中。
方法2:
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS my_database; USE my_database; SOURCE bf.sql;"
命令作用:
連接到 MySQL 數據庫服務器。
使用 root 用戶(系統會提示輸入密碼)。
創建一個名為 my_database 的數據庫,如果該數據庫已經存在則不做任何操作。
選擇使用剛創建或已存在的 my_database 數據庫。
從 bf.sql 文件中讀取并執行 SQL 語句。
2、如何更改 root 密碼。
1、停止 MySQL 服務:
sudo systemctl stop mysqld
2、編輯 MySQL 配置文件 /etc/my.cnf,在 [mysqld] 部分添加:
[mysqld]
skip-grant-tables
作用:
skip-grant-tables 是一個 MySQL 配置選項,它指示 MySQL 在啟動時跳過對授權表的加載和驗證。
3、重啟 MySQL:
sudo systemctl restart mysqld
4、登錄 MySQL(無密碼):
mysql -u root
5、修改密碼:
USE mysql;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密碼';
FLUSH PRIVILEGES;
6、退出 MySQL:
exit;
7、恢復配置文件:刪除 skip-grant-tables 配置行,注意安全隱患。
重啟 MySQL 服務:
sudo systemctl restart mysqld
使用新密碼登錄:
mysql -u root -p
這樣就完成了root用戶密碼修改的過程。
3、密碼策略
密碼策略的難度有三個主要級別:
STRONG(最嚴格) | - 密碼長度至少 12 個字符 |
---|
| - 包含大寫字母、小寫字母、數字和特殊字符(如 !@#$%^&*()_+ 等) |
| - 避免使用字典單詞、常見的密碼或簡單的字符序列(如 123456 、password 等) |
| - 字符種類應分布均勻,避免使用重復字符或簡單模式 |
MEDIUM(中等復雜度) | - 密碼長度至少 8 個字符 |
| - 包含大寫字母、小寫字母和數字,可以包含特殊字符,但不強制要求 |
| - 對字典單詞的限制較弱,盡量避免常見的單詞組合 |
LOW(最寬松) | - 密碼長度至少 6 個字符 |
| - 沒有特別要求字符種類,可以僅使用小寫字母或數字(例如 abc123 ) |
| - 允許使用字典單詞和常見密碼組合(如 password123 、qwerty 等) |
validate_password.changed_characters_percentage | 0 | 0 表示密碼在修改時不強制要求更改特定比例的字符。該變量控制密碼更改時必須改變的字符比例。 |
---|
validate_password.check_user_name | ON | ON 表示密碼驗證器會檢查密碼是否與用戶名相同。如果密碼與用戶名相同,將被視為不安全密碼。 |
validate_password.dictionary_file | (空) | 該字段為空,表示未指定用于驗證密碼的字典文件。通常這個文件包含一些常見的字典單詞,用于避免使用字典單詞作為密碼。 |
validate_password.length | 8 | 密碼長度要求為至少 8 個字符。 |
validate_password.mixed_case_count | 1 | 密碼至少需要包含 1 個大寫字母和 1 個小寫字母。 |
validate_password.number_count | 1 | 密碼必須包含至少 1 個數字字符。 |
validate_password.policy | MEDIUM | 密碼策略為 MEDIUM,即中等復雜度密碼策略。密碼必須包含多種字符類型(如字母、數字、特殊字符),但對字典單詞限制較弱。 |
validate_password.special_char_count | 1 | 密碼必須包含至少 1 個特殊字符(如 !@#$%^&*() 等)。 |
第一次安裝設置密碼:#查看Mysql版本
SELECT VERSION();
# 從日志文件中提取臨時密碼
grep 'temporary password' /var/log/mysqld.log
#登錄mysql 輸入臨時密碼
mysql -u root -p
#修改密碼
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密碼'; #注意字母大小寫和特殊符號和密碼長度。
#刷新權限
FLUSH PRIVILEGES;
#退出服務
exit
修改密碼為:123456
#登錄mysql 輸入密碼
mysql -u root -p#檢查當前 MySQL 的密碼策略設置
SHOW VARIABLES LIKE 'validate_password%';#設置密碼策略為 LOW 寬松策略
SET GLOBAL validate_password.policy = LOW;#調整密碼長度
SET GLOBAL validate_password.length = 6;#禁用混合大小寫字母要求
SET GLOBAL validate_password.mixed_case_count = 0;#禁用數字要求
SET GLOBAL validate_password.number_count = 0;#禁用特殊字符要求
SET GLOBAL validate_password.special_char_count = 0;#如果您希望完全禁用密碼策略(不推薦,除非有特殊需求),可以這樣設置:
SET GLOBAL validate_password.policy = 0;#刷新權限
FLUSH PRIVILEGES;#修改用戶密碼
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';#退出服務
exit
補充其他常用命令:#查看root用戶權限
SELECT user, host FROM mysql.user WHERE user = 'root';
#查看所有用戶權限表
SELECT user, host FROM mysql.user;
#修改用戶密碼
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
#如果權限查看 host 是% 號的話 改成這個命令修改密碼。
ALTER USER 'root'@'%' IDENTIFIED BY '123456';#查詢 MySQL 當前安裝并啟用的插件的命令
SHOW PLUGINS;
#查看validate_password密碼插件策略
SHOW VARIABLES LIKE 'validate_password%';
#卸載密碼驗證插件
UNINSTALL PLUGIN validate_password;
#如果插件未安裝,可以使用以下命令安裝該插件
INSTALL PLUGIN validate_password SONAME 'validate_password.so';