Linux安裝Mysql8.0.20並配置主從復制(一主一從,雙主雙從)


1. 主從復制解釋

  將主數據庫的增刪改查等操作記錄到二進制日志文件中,從庫接收主庫日志文件,根據最后一次更新的起始位置,同步復制到從數據庫中,使得主從數據庫保持一致。

2. 主從復制的作用

  • 高可用性:主數據庫異常可切換到從數據庫
  • 負載均衡:實現讀寫分離
  • 備份:進行日常備份

3. Mysql主從復制過程


  Binary log:主數據庫的二進制日志;Relay log:從服務器的中繼日志。

復制過程:
  (1)主數據庫在每次事務完成前,將該操作記錄到binlog日志文件中;
  (2)從數據庫中有一個I/O線程,負責連接主數據庫服務,並讀取binlog日志變化,如果發現有新的變動,則將變動寫入到relay-log,否則進入休眠狀態;
  (3)從數據庫中的SQL Thread讀取中繼日志,並串行執行SQL事件,使得從數據庫與主數據庫始終保持一致。

注意事項:
  (1)涉及時間函數時,會出現數據不一致。原因是,復制過程的兩次IO操作和網絡、磁盤效率等問題勢必導致時間戳不一致;
  (2)涉及系統函數時,會出現不一致。如:@@hostname,獲取主機名稱,主從數據庫服務器名稱不一致導致數據不一致;
  (3)......

4. 一主一從配置

  • 服務器划分
服務器IP 角色
192.168.133.129 Master1
192.168.133.130 Slave1
  • 主數據庫安裝
# 進入目錄
cd /opt

# 下載安裝包
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz

# 解壓
tar -xvf mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz

# 拷貝到/usr/local
mv /opt/mysql-8.0.20-linux-glibc2.12-x86_64 /usr/local

# 進入/usr/local
cd /usr/local

# 修改名稱為mysql-8.0.20
mv mysql-8.0.20-linux-glibc2.12-x86_64 mysql-8.0.20

# 創建存放數據文件夾
mkdir /usr/local/mysql-8.0.20/data

# 創建用戶及用戶組
groupadd mysql
useradd -g mysql mysql

# 授權
chown -R mysql.mysql /usr/local/mysql-8.0.20

# 初始化數據庫(記錄臨時密碼)
cd /usr/local/mysql-8.0.20/

./bin/mysqld --user=mysql --lower-case-table-names=1 --basedir=/usr/local/mysql-8.0.20/ --datadir=/usr/local/mysql-8.0.20/data/ --initialize ;

# 配置my.cnf
vi /etc/my.cnf

# 清空,使用下面內容
// 文件內容開始

[mysqld]
basedir=/usr/local/mysql-8.0.20
datadir=/usr/local/mysql-8.0.20/data
character-set-server=utf8
lower-case-table-names=1
default_authentication_plugin=mysql_native_password

# 主從復制-主機配置
# 主服務器唯一ID
server-id=1
# 啟用二進制日志
log-bin=mysql-bin
# 設置不要復制的數據庫(可設置多個)
binlog-ignore-db=sys
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
# 設置需要復制的數據庫(可設置多個)
binlog-do-db=test
# 設置logbin格式
binlog_format=STATEMENT

// 文件內容結束

# 建立Mysql服務
cp -a ./support-files/mysql.server /etc/init.d/mysql
chmod +x /etc/init.d/mysql
chkconfig --add mysql

# 檢查服務是否生效
chkconfig --list mysql

# 啟動、停止、重啟
service mysql start
service mysql stop
service mysql restart

# 創建軟連接
ln -s /usr/local/mysql-8.0.20/bin/mysql /usr/bin 

# 登錄(使用臨時密碼)
mysql -uroot -p

# 修改密碼
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new password';

# 退出,使用新密碼登錄
quit
mysql -uroot -p

# 修改root權限,增加遠程連接
use mysql
update user set host ='%' where user='root';
alter user 'root'@'%' identified with mysql_native_password by 'new password';
flush privileges;

# 退出
quit
  • 從數據庫安裝
      和主數據庫安裝一致,但配置文件內容不同。
# 配置my.cnf
vi /etc/my.cnf

# 清空,使用下面內容
// 文件內容開始

[mysqld]
basedir=/usr/local/mysql-8.0.20
datadir=/usr/local/mysql-8.0.20/data
character-set-server=utf8
lower-case-table-names=1
default_authentication_plugin=mysql_native_password

# 主從復制-從機配置
# 從服務器唯一ID
server-id=2
# 啟用中繼日志
relay-log=mysql-relay

// 文件內容結束
  • 關閉主從數據庫服務器防火牆或開放3306端口
# 查看防火牆狀態
systemctl status firewalld

# 關閉防火牆
systemctl stop firewalld
  • 主從數據庫測試是否已經可以遠程訪問
# 主數據庫服務器測試從數據庫
mysql -uroot -p -h192.168.133.130 -P3306

# 從數據庫服務器測試主數據庫
mysql -uroot -p -h192.168.133.129 -P3306
  • 主數據庫創建用戶slave並授權
# 登錄
mysql -uroot -p

# 創建用戶
create user 'slave'@'%' identified with mysql_native_password by 'password';

# 授權
grant replication slave on *.* to 'slave'@'%';

# 刷新權限
flush privileges;
  • 從數據庫驗證slave用戶是否可用
mysql -uslave -p -h192.168.133.129 -P3306
  • 主數據庫查詢服務ID及Master狀態
# 登錄
mysql -uroot -p

# 查詢server_id是否可配置文件中一致
show variables like 'server_id';

# 若不一致,可設置臨時ID(重啟失效)
set global server_id = 1;

# 查詢Master狀態,並記錄 File 和 Position 的值
show master status;

# 注意:執行完此步驟后退出主數據庫,防止再次操作導致 File 和 Position 的值發生變化
  • 從數據庫中設置主數據庫
# 登錄
mysql -uroot -p

# 查詢server_id是否可配置文件中一致
show variables like 'server_id';

# 若不一致,可設置臨時ID(重啟失效)
set global server_id = 2;

# 設置主數據庫參數
change master to master_host='192.168.133.129',master_port=3306,master_user='slave',master_password='password',master_log_file='mysql-bin.000002',master_log_pos=156;

# 開始同步
start slave;

# 若出現錯誤,則停止同步,重置后再次啟動
stop slave;
reset slave;
start slave;

# 查詢Slave狀態
show slave status\G

# 查看是否配置成功
# 查看參數 Slave_IO_Running 和 Slave_SQL_Running 是否都為yes,則證明配置成功。若為no,則需要查看對應的 Last_IO_Error 或 Last_SQL_Error 的異常值。
  • 測試
      通過工具連接主從數據庫或者在服務器連接。
      注意:主數據庫的配置文件中配置了需要同步的數據庫,因此只會同步配置的數據庫,不配置則同步全部。
# 在主數據庫創建數據庫test
create database test;

# 從數據庫查看
show databases;

# 在主數據庫創建表
use test;
create table t_user(id int, name varchar(20));

# 插入數據
insert into t_user values(1, 'C3Stones');

# 在從數據庫查看
use test;
select * from t_user;

# 其他刪改查操作請自行測試

5. 雙主雙從配置

  雙主雙從即兩台主機分別存在兩台從機,每台從機只復制對應的主機,兩台主機互為主備。

  • 服務器划分
服務器IP 角色
192.168.133.129 Master1
192.168.133.130 Slave1
192.168.133.131 Master2
192.168.133.132 Slave2
  • 安裝數據庫請參考上述安裝主數據庫
    四個配置文件替換如下:
    (1)Mater1
[mysqld]
basedir=/usr/local/mysql-8.0.20
datadir=/usr/local/mysql-8.0.20/data
character-set-server=utf8
lower-case-table-names=1
default_authentication_plugin=mysql_native_password

# 主從復制-主機1配置
# 主服務器唯一ID
server-id=1
# 啟用二進制日志
log-bin=mysql-bin
# 設置不要復制的數據庫(可設置多個)
binlog-ignore-db=sys
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
# 設置需要復制的數據庫(可設置多個)
binlog-do-db=test
# 設置logbin格式
binlog_format=STATEMENT
# 寫入操作更新二進制日志文件
log-slave-updates
# 自增長字段起始值,默認值為1,取值范圍:1 ~ 65535
auto-increment-increment=2
# 自增長字段遞增量,取值范圍:1 ~ 65535
auto-increment-offset=1

(2)Mater2

[mysqld]
basedir=/usr/local/mysql-8.0.20
datadir=/usr/local/mysql-8.0.20/data
character-set-server=utf8
lower-case-table-names=1
default_authentication_plugin=mysql_native_password

# 主從復制-主機2配置
# 主服務器唯一ID
server-id=3
# 啟用二進制日志
log-bin=mysql-bin
# 設置不要復制的數據庫(可設置多個)
binlog-ignore-db=sys
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
# 設置需要復制的數據庫(可設置多個)
binlog-do-db=test
# 設置logbin格式
binlog_format=STATEMENT
# 寫入操作更新二進制日志文件
log-slave-updates
# 自增長字段起始值,默認值為1,取值范圍:1 ~ 65535
auto-increment-increment=2
# 自增長字段遞增量,取值范圍:1 ~ 65535
auto-increment-offset=2

(3)Slave1

[mysqld]
basedir=/usr/local/mysql-8.0.20
datadir=/usr/local/mysql-8.0.20/data
character-set-server=utf8
lower-case-table-names=1
default_authentication_plugin=mysql_native_password

# 主從復制-從機1配置
# 從服務器唯一ID
server-id=2
# 啟用中繼日志
relay-log=mysql-relay

(4)Slave2

[mysqld]
basedir=/usr/local/mysql-8.0.20
datadir=/usr/local/mysql-8.0.20/data
character-set-server=utf8
lower-case-table-names=1
default_authentication_plugin=mysql_native_password

# 主從復制-從機2配置
# 從服務器唯一ID
server-id=4
# 啟用中繼日志
relay-log=mysql-relay
  • 雙主雙從數據庫均重啟
service restart mysql
  • 四台服務器均關閉防火牆
systemctl stop firewalld
  • 兩台主數據庫分別創建用戶slave並授權
# 登錄
mysql -uroot -p

# 創建用戶
create user 'slave'@'%' identified with mysql_native_password by 'password';

# 授權
grant replication slave on *.* to 'slave'@'%';

# 刷新權限
flush privileges;
  • 主從數據庫驗證slave用戶是否可用
# 主數據庫1服務器測試
mysql -uslave -p -h192.168.133.130 -P3306
mysql -uslave -p -h192.168.133.131 -P3306

# 從數據庫1服務器測試主數據庫1
mysql -uroot -p -h192.168.133.129 -P3306

# 主數據庫2服務器測試
mysql -uslave -p -h192.168.133.129 -P3306
mysql -uslave -p -h192.168.133.132 -P3306

# 從數據庫1服務器測試主數據庫1
mysql -uroot -p -h192.168.133.131 -P3306
  • 兩台主數據庫查詢服務ID及Master狀態
# 登錄
mysql -uroot -p

# 查詢server_id是否可配置文件中一致
show variables like 'server_id';

# 若不一致,可設置臨時ID(重啟失效)
# 主數據庫1
set global server_id = 1;
# 主數據庫2
set global server_id = 3;

# 查詢Master狀態,並記錄 File 和 Position 的值
show master status;

# 注意:執行完此步驟后退出主數據庫,防止再次操作導致 File 和 Position 的值發生變化
  • 從數據庫1中設置主數據庫1
# 登錄
mysql -uroot -p

# 查詢server_id是否可配置文件中一致
show variables like 'server_id';

# 若不一致,可設置臨時ID(重啟失效)
set global server_id = 2;

# 設置主數據庫參數
change master to master_host='192.168.133.129',master_port=3306,master_user='slave',master_password='password',master_log_file='mysql-bin.000003',master_log_pos=156;

# 開始同步
start slave;

# 若出現錯誤,則停止同步,重置后再次啟動
stop slave;
reset slave;
start slave;

# 查詢Slave狀態
show slave status\G

# 查看是否配置成功
# 查看參數 Slave_IO_Running 和 Slave_SQL_Running 是否都為yes,則證明配置成功。若為no,則需要查看對應的 Last_IO_Error 或 Last_SQL_Error 的異常值。
  • 從數據庫2中設置主數據庫2
# 登錄
mysql -uroot -p

# 查詢server_id是否可配置文件中一致
show variables like 'server_id';

# 若不一致,可設置臨時ID(重啟失效)
set global server_id = 4;

# 設置主數據參數
change master to master_host='192.168.133.131',master_port=3306,master_user='slave',master_password='password',master_log_file='mysql-bin.000001',master_log_pos=156;

# 開始同步
start slave;

# 若出現錯誤,則停止同步,重置后再次啟動
stop slave;
reset slave;
start slave;

# 查詢Slave狀態
show slave status\G

# 查看是否配置成功
# 查看參數 Slave_IO_Running 和 Slave_SQL_Running 是否都為yes,則證明配置成功。若為no,則需要查看對應的 Last_IO_Error 或 Last_SQL_Error 的異常值。
  • 主數據庫1中設置主數據庫2
# 登錄
mysql -uroot -p

# 設置主數據庫參數
change master to master_host='192.168.133.131',master_port=3306,master_user='slave',master_password='password',master_log_file='mysql-bin.000001',master_log_pos=156;

# 開始同步
start slave;

# 若出現錯誤,則停止同步,重置后再次啟動
stop slave;
reset slave;
start slave;

# 查詢Slave狀態
show slave status\G

# 查看是否配置成功
# 查看參數 Slave_IO_Running 和 Slave_SQL_Running 是否都為yes,則證明配置成功。若為no,則需要查看對應的 Last_IO_Error 或 Last_SQL_Error 的異常值。
  • 主數據庫2中設置主數據庫1
# 登錄
mysql -uroot -p

# 設置主數據庫參數
change master to master_host='192.168.133.129',master_port=3306,master_user='slave',master_password='password',master_log_file='mysql-bin.000003',master_log_pos=156;

# 開始同步
start slave;

# 若出現錯誤,則停止同步,重置后再次啟動
stop slave;
reset slave;
start slave;

# 查詢Slave狀態
show slave status\G

# 查看是否配置成功
# 查看參數 Slave_IO_Running 和 Slave_SQL_Running 是否都為yes,則證明配置成功。若為no,則需要查看對應的 Last_IO_Error 或 Last_SQL_Error 的異常值。
  • 測試
      通過工具連接雙主雙從數據庫或者在服務器連接。
      注意:主數據庫的配置文件中配置了需要同步的數據庫,因此只會同步配置的數據庫,不配置則同步全部。
# 在主數據庫1創建數據庫test
create database test;

# 其他三個數據庫查看
show databases;

# 在主數據庫1創建表
use test;
create table t_user(id int, name varchar(20));

# 插入數據
insert into t_user values(1, 'C3Stones');

# 其他三個數據庫查看
use test;
select * from t_user;

# 其他刪改查操作請自行測試


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM