MySQL 主從復制(Replication)是實現數據高可用、讀寫分離及異地容災的核心機制之一。主庫寫、從庫讀,提升并發能力;讀寫分離,減輕主庫壓力。
本地 windows 系統有一個Linux Ubuntu子系統,版本為Ubuntu 24.04.2 LTS。
想在這個子系統上安裝Mysql主從配置,打開官網:https://dev.mysql.com/downloads/mysql/ 進行下載操作。
下載鏈接有那么多,下載哪個呢?有幾個概念也不太理解。
一、什么是DEB
DEB Bundle (捆綁包) 是一組 .deb 文件的壓縮包(通常是 .tar.gz),里面包含多個 .deb 安裝包。
比如 mysql-8.4.5-debian11-x86_64.deb-bundle.tar 包含了 mysql-common_8.4.5.deb、mysql-community-client_8.4.5.deb、mysql-community-server_8.4.5.deb、mysql-community-libs_8.4.5.deb等等。可以用 tar -xvf 解開看。
.deb 文件里包含了某個軟件的二進制可執行文件、配置文件、依賴說明等等。
DEB Package 通常指的是 單個的 .deb 軟件包文件。mysql-community-server.deb 是 MySQL 服務端(數據庫引擎),mysql-community-client.deb 是 MySQL 客戶端程序(mysql命令行工具等),mysql-common.deb 是 共享配置,基礎內容。“DEB Package”是最泛指的概念 —— 單個包。
也就是說,一個DEB Bundle 包含了多個deb,不需要那么多可以單獨下載某個deb。
二、安裝 MySQL8.4.5
MySQL已經升級到9了,選擇MySQL8.4.5是因為這是一個長期支持的版本。
DEB 的安裝方式:sudo dpkg -i xxx.deb 或 sudo apt install ./xxx.deb。下載單個 Deb包,可能會導致依賴不完整,僅適合臨時測試環境,官網建議 apt 方式,那我就試試apt方式。
1、添加 MySQL 官方 APT 倉庫
MySQL 的 APT 配置工具包下載地址:https://repo.mysql.com/
# 下載倉庫配置包
wget https://repo.mysql.com/mysql-apt-config_0.8.34-1_all.deb
頭幾次安裝都失敗了,原因是沒找到合適的配置工具包,這次使用0.8.34版本。
# 安裝并選擇版本
sudodpkg-imysql-apt-config_0.8.34-1_all.deb
少截了一個圖片,在第三個對話框中選擇OK,否則就進入死循環了。
2、更新軟件源并安裝
# 更新 APT 軟件包列表
sudo apt update
# 安裝 MySQL Server 指定版本(注意包名格式)
# sudo apt install mysql-server=8.4.5-1ubuntu24.04sudo apt install mysql-server
在安裝的過程中會跳出來密碼確認頁面:
安裝完成后,會在提示信息中看到配置文件的路徑:
3、驗證安裝
# 登錄測試
mysql -u root -p
確保 MySQL 服務正常啟動并設置開機自啟:
#啟動 MySQL 服務
sudo systemctl start mysql
#停止 MySQL 服務
sudo systemctl stop mysql
#開機自啟
sudo systemctl?enable?mysql
#禁止開機自啟
sudo systemctl?disable?mysql
#檢查服務狀態
systemctl status mysql
在安裝的時候踩了個大坑,剛開始怎么安裝都安裝失敗,主要原因是配置工具包不是最新的,不是 Ubuntu24.04 支持的版本,但是想想都有Ubuntu對應的bed,怎么會不支持呢?最后找到了配置包的下載地址,換了個配置包就好了。
4、說說配置文件
查看mysql的配置文件,發現這個配置文件很繞、層層嵌套,這無疑加大了主從庫配置的難度。
理想狀態下的配置文件目錄:
/etc/mysql/my.cnf
ubuntu的配置文件:
查看我安裝的目錄結構:
果真,my.cnf 導入了 /etc/mysql/conf.d/ 和 /etc/mysql/mysql.conf.d/ 這兩個文件:
為什么配置文件也要層層嵌套呢?
好像有道理。
為了方便,我決定還是使用 /etc/mysql/my.cnf 這一個配置文件吧。
三、主從復制配置
1、停止現有服務
sudo systemctl stop mysql
2、為mysql創建專屬用戶和用戶組
#創建mysql用戶組
groupadd -g?27?mysql#創建該組下的用戶
sudo useradd -u?1027?-g mysql mysql-admin#查看用戶的id信息
id?mysql-admin
3、?創建多實例環境
# 主庫目錄
sudo mkdir -p /var/lib/mysql-master
# 更改目錄權限
sudo chown mysql-admin:mysql /var/lib/mysql-master# 從庫目錄
sudo mkdir -p /var/lib/mysql-slave
# 更改目錄權限
sudo chown mysql-admin:mysql /var/lib/mysql-slave# 更改啟動目錄下內容的權限
sudo chown mysql-admin:mysql /var/run/mysqld/
4、配置文件統一配置
編輯 /etc/mysql/my.cnf
sudo nano /etc/mysql/my.cnf
/etc/mysql/my.cnf 內容設置如下:
[mysqld_multi]
mysqld=/usr/bin/mysqld_safe ?# 使用守護進程啟動
mysqladmin=/usr/bin/mysqladmin
log=/var/lib/mysqld_multi.log[mysqld1]
# 源服務器(原主服務器)配置
server-id=1
port=3306
# 啟用二進制日志
log_bin=/var/lib/mysql-master/mysql-bindatadir=/var/lib/mysql-master
# 主庫socket
socket=/var/run/mysqld/mysqld-master.sock
pid-file=/var/run/mysqld/mysqld-master.pid# 需要復制的數據庫(可選)
binlog-do-db=rsdun
binlog-do-db=rsdun-circle# 不需要復制的數據庫(可選)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys# 設置日志保留時間(天),7天 = 7×24×60×60 = 604800秒
binlog_expire_logs_seconds=604800# 主服務器默認字符集
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ciuser=mysql-admin[mysqld2]
# 副本服務器(原從服務器)配置
server-id=2
port=3307datadir=/var/lib/mysql-slave
# 從庫socket
socket=/var/run/mysqld/mysqld-slave.sock
pid-file=/var/run/mysqld/mysqld-slave.pid# 啟用中繼日志
relay_log = /var/lib/mysql-slave/relay-log
relay_log_index = /var/lib/mysql-slave/relay-log.index# 從服務器默認字符集
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci# 副本服務器專用設置
read_only=1user=mysql-admin
4.?初始化并啟動實例
# 初始化源服務器
sudo mysqld --defaults-file=/etc/mysql/my.cnf --initialize --user=mysql-admin --datadir=/var/lib/mysql-master
# 初始化副本服務器
sudo mysqld --defaults-file=/etc/mysql/my.cnf --initialize --user=mysql-admin --datadir=/var/lib/mysql-slave
# 啟動實例
sudo mysqld_multi start# 查看啟動情況
sudo mysqld_multi report
根據上面的密碼使用客戶端修改主從庫的密碼:
5、主服務器配置
連接主服務器:
mysql -S /var/run/mysqld/mysqld-master.sock -u root
# 或
mysql -u root -p --protocol=TCP -P?3306
創建復制用戶
-- 主庫創建復制用戶
CREATE USER 'repl'@'localhost' IDENTIFIED BY '123456';# 分配復制權限
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'localhost';#授權后需要刷新后,才能生效;
flush privileges;?# 查看主服務器狀態
SHOW BINARY LOG STATUS;?
6、從服務器配置
連接從服務器:
mysql -S /var/run/mysqld/mysqld-slave.sock -u root
# 或
mysql -u root -p --protocol=TCP -P?3307-- 從庫配置主庫信息
CHANGE REPLICATION SOURCE TO SOURCE_HOST='127.0.0.1', SOURCE_PORT=3306,SOURCE_LOG_FILE='mysql-bin.000002',SOURCE_LOG_POS=1207,SOURCE_CONNECT_RETRY=10;# 授權復制用戶名密碼
START REPLICA USER='repl'?PASSWORD='repl_password';# 啟動從服務器復制進程
START REPLICA;
# 停止從服務器的復制過程
STOP REPLICA;
# 檢查從服務器狀態,替代原來的 SHOW SLAVE STATUS
SHOW REPLICA STATUS;?
執行這一系列步驟后,同步狀態出錯了。
出錯原因:
大概意思是,mysql8.4.5默認采用的是 caching_sha2_password 插件,要求安全連接(SSL/TLS),而我目前并沒有配置SSL。因此呢還需要把同步用戶的插件調整為mysql_native_password 插件。
7、開啟 mysql_native_password 插件
先停止主從庫的服務,在my.cnf增加 mysql_native_password 配置:
mysql_native_password=on
在windows server2008上通過設置mysql_native_password=on就生效了,在這個系統上應該也可以。
主從庫都要加這個配置項目,設置后進行重啟。
# 重啟主從庫
sudo mysqld_multi reload 1,2
發現上面這個命令沒有用,只能使用最簡單粗暴的殺死命令,然后在啟動服務器。
# 查找端口號所在pid
sudo lsof -i :3306
# 殺死pid
sudo?kill?-9 3670
如果還不行,那就重啟電腦吧,重啟電腦能解決百分之九十的問題。
重啟后再次登錄主庫:
mysql -u root -p --protocol=TCP -P 3306
# 查詢同步用戶的插件
select host,user,plugin from mysql.user?where?user='repl';# 修改主庫同步用戶的插件:
ALTER USER?'repl'@'%'?IDENTIFIED WITH mysql_native_password BY?'repl_password'?REQUIRE NONE;# 刷新生效
FLUSH PRIVILEGES;
REQUIRE NONE 表示 MySQL 用戶賬戶可以在不加密的連接上進行身份驗證和操作。這是 MySQL 用戶賬戶的默認安全要求級別。
四個相關的參數:
REQUIRE NONE:不強制要求加密連接(默認)。
REQUIRE SSL:要求使用 SSL 加密連接。
REQUIRE X509:要求使用有效的 X509 證書。
REQUIRE CIPHER:要求使用特定加密算法 。
從到從庫,再把從庫的復制操作走一遍:
mysql -u root -p --protocol=TCP -P 3307-- 從庫配置主庫信息
CHANGE REPLICATION SOURCE TO SOURCE_HOST='127.0.0.1', SOURCE_PORT=3306,SOURCE_LOG_FILE='mysql-bin.000002',SOURCE_LOG_POS=1207,SOURCE_CONNECT_RETRY=10;# 授權復制用戶名密碼
START REPLICA USER='repl'?PASSWORD='repl_password';# 啟動從服務器復制進程
START REPLICA;
# 停止從服務器的復制過程
STOP REPLICA;
# 檢查從服務器狀態,替代原來的 SHOW SLAVE STATUS
SHOW REPLICA STATUS;?
最后查看主從配置的狀態:
終于配置成功了。
8、在從庫上創建后只讀用戶
CREATE USER?'root_readonly'@'%'?IDENTIFIED BY?'123456';
# 只讀授權
GRANT SELECT ON *.* TO?'root_readonly'@'%';
#執行刷新,刷新后;
flush privileges;
四、最后總結
這次安裝一點也不順利,重裝過好多次,有時候是在mysql8.4.5初始化那一步就錯了,有時候是在啟動的時候報錯,反倒是配置主從庫的順利一點。
一方面,對Linux ubuntu系統不熟悉。另一方面,Linux系統對文件的權限管理比較嚴格。還有一點,最近做事有點不用心
回顧這些次的安裝,每次都是文件權限的問題,但是當時沒有意識到是文件權限的問題,還以為配置錯了,走了很多彎路。
使用Linux系統,一定要特別留意文件夾權限!不要設置錯了!
比如說這兩個設置目錄權限:
# 更改目錄權限
sudo chown mysql-admin:mysql /var/run/mysqld
# 更改目錄下所有內容的權限
sudo chown mysql-admin:mysql /var/run/mysqld/
這兩個命令是不一樣的。
第一個命令,最后不帶斜杠的,作用于 /var/run/mysqld 這個目錄本身(作為一個文件對象),只改變目錄本身的 ownership,不影響目錄內的內容 。
第二個命令帶斜杠的,末尾的斜杠表示這是一個目錄路徑,在大多數情況下,行為與第一個命令相同(改變目錄本身的 ownership),在某些特殊情況下(如當 `/var/ /var/run/mysqld 是符號鏈接時),行為可能會有不同。