日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL主从同步(复制)

發布時間:2025/3/21 数据库 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL主从同步(复制) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

一.主從同步概述

1.主從同步原理

2.主從同步實現步驟

二.主從示例

1.準備主服務器數據

2.主服務器配置

3.配置從服務器

三.配置其他的主從

1.主從同步結構

2.一主多從配置

3.主從從配置

4.主主模式

四.復制模式

1.復制的概述

2.模式配置


一.主從同步概述

  • 實現數據自動同步的服務結構

  • 主服務器:接受客戶端訪問連接

  • 從服務器:自動同步主服務器數據

1.主從同步原理

Master

  • 啟用binlog日志

Slave:

  • Slave_IO:復制master主機 binlog日志文件里的SQL命令到本機的relay-log文件里。

  • Slave_SQL:執行本機relay-log文件里的SQL語句,實現與Master數據一致。

注:做主從之前數據必須一志

構建主從同步示例準備

master:192.168.1.11

slave:192.168.1.12

2.主從同步實現步驟

主服務器

  • 啟用binlog日志

  • 授權用戶

  • 查看binlog日志信息

從服務器

  • 設置server_id

  • 確保與主服務器數據一致

  • 指定主庫信息

  • 啟動slave程序

  • 查看狀態信息

二.主從示例

1.準備主服務器數據

[root@zzgrhel8 ~]# scp -r /root/tedu_nsd/dbs/mysql_scripts/ 192.168.1.11:/root [root@zzgrhel8 ~]# ssh 192.168.1.11 [root@mysql1 ~]# mysql -uroot -pNSD2021@tedu.cn < mysql_scripts/nsd2021_data.sql

2.主服務器配置

# 修改配置文件 [root@mysql1 ~]# vim /etc/my.cnf [mysqld] server_id = 11 log-bin = master11 ... ... # 啟動服務 [root@mysql1 ~]# systemctl restart mysqld # 驗證配置 [root@mysql1 ~]# ls /var/lib/mysql/master11.* /var/lib/mysql/master11.000001 /var/lib/mysql/master11.index [root@mysql1 ~]# mysql -uroot -pNSD2021@tedu.cn mysql> show master status; +-----------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-----------------+----------+--------------+------------------+-------------------+ | master11.000001 | 154 | | | | +-----------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)

# 如果日志不是master11.000001,希望回到最初狀態,可以執行以下命令:
mysql> reset master;

# 授權輔助服務器可以同步數據 mysql> grant replication slave on *.* to repluser@'%' identified by 'NSD2021@tedu.cn'; mysql> show grants for repluser@'%'; +--------------------------------------------------+ | Grants for repluser@% | +--------------------------------------------------+ | GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'%' | +--------------------------------------------------+ 1 row in set (0.00 sec)

3.配置從服務器

1)修改配置文件

[root@mysql2 ~]# vim /etc/my.cnf [mysqld] server_id = 12 ... ...[root@mysql2 ~]# systemctl restart mysqld

2)如果主服務器上已有一段時間的數據,需要將主服務器數據完全同步到從服務器。

# 主服務器備份數據 [root@mysql1 ~]# mysqldump -uroot -pNSD2021@tedu.cn --master-data nsd2021 > /root/fullbackup.sql ? [root@mysql1 ~]# scp /root/fullbackup.sql 192.168.1.12:/root/ # 從服務器恢復數據 mysql> create database nsd2021 default charset utf8mb4; [root@mysql2 ~]# mysql -uroot -pNSD2021@tedu.cn nsd2021 < /root/fullbackup.sql

--master-data的作用:如果完全備份完成后,又有新的數據產生,它可記錄備份時的數據狀態信息。

3)查看binlog日志名和偏移量

# 使用備份的方式同步主服務器數據,在備份文件中查找 [root@mysql2 ~]# grep master11 fullbackup.sql CHANGE MASTER TO MASTER_LOG_FILE='master11.000001', MASTER_LOG_POS=174149; # 沒有進行數據同步的,查看主服務器日志狀態 [root@mysl2 ~]# mysql -uroot -pNSD2021@tedu.cn mysql> show master status; +-----------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-----------------+----------+--------------+------------------+-------------------+ | master11.000001 | 174149 | | | | +-----------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)

4)在從服務器上配置同步的主庫信息

[root@mysql2 ~]# mysql -uroot -pNSD2021@tedu.cn mysql> change master to-> master_host="192.168.1.11",-> master_user="repluser",-> master_password="NSD2021@tedu.cn",-> master_log_file="master11.000001",-> master_log_pos=174149; Query OK, 0 rows affected, 2 warnings (0.10 sec)

5)啟動slave程序

mysql> start slave; Query OK, 0 rows affected (0.03 sec)

6)驗證:查看狀態信息

mysql> show slave status\G ... ...Slave_IO_Running: YesSlave_SQL_Running: Yes ... ...
  • 驗證:查看從服務器上的相關文件

[root@mysql2 ~]# ls /var/lib/mysql

文件

說明

master.info

主庫信息

relay-log.info

中繼日志信息

主機名-relay-bin.xxxxxx

中繼日志

主機名-relay-bin.index

索引文件

7)排錯

  • 通過show slave status查看錯誤說明

  • 如果在從庫上配置主庫信息輸入錯誤需要關閉后slave功能配置,然后再開啟slave功能

    mysql> stop slave; mysql> show slave status\G mysql> start slave;
  • master.info文件和relay-log.info文件有配置記錄,可用于排錯

  • 將表中的4個文件全部刪除重啟服務,可以還原為獨立的、非從服務器。

8)驗證主從同步效果

  • 在主服務器上添加授權用戶,允許客戶端進行連接

[root@mysql1 ~]# mysql -uroot -pNSD2021@tedu.cn mysql> grant all on nsd2021.* to admin@'%' identified by 'NSD2021@tedu.cn'; Query OK, 0 rows affected, 1 warning (0.06 sec)
  • 客戶端連接主服務器,更新數據

# 確認客戶端已安裝客戶端軟件 [root@zzgrhel8 ~]# rpm -q mysql-community-client mysql-community-client-5.7.17-1.el7.x86_64[root@zzgrhel8 ~]# mysql -h 192.168.1.11 -uadmin -pNSD2021@tedu.cn

9)查看自己的權限

mysql> show grants; +----------------------------------------------------+ | Grants for admin@% | +----------------------------------------------------+ | GRANT USAGE ON *.* TO 'admin'@'%' | | GRANT ALL PRIVILEGES ON `nsd2021`.* TO 'admin'@'%' | +----------------------------------------------------+ 2 rows in set (0.00 sec) # 增加數據 mysql> use nsd2021; mysql> insert into departments(dept_name) values('sales1'); Query OK, 1 row affected (0.05 sec)mysql> insert into departments(dept_name) values('sales2'); Query OK, 1 row affected (0.05 sec)mysql> insert into departments(dept_name) values('sales3'); Query OK, 1 row affected (0.08 sec)

10)從服務器驗證同步數據

[root@mysql2 ~]# mysql -uroot -pNSD2021@tedu.cn mysql> use nsd2021; mysql> select * from departments where dept_name like 'sales_'; +---------+-----------+ | dept_id | dept_name | +---------+-----------+ | 9 | sales1 | | 10 | sales2 | | 11 | sales3 | +---------+-----------+ 3 rows in set (0.00 sec)

三.配置其他的主從

1.主從同步結構

結構類型

  • 一主一從

??????????????? -master

????????????????-slave

  • 一主多從

????????????????-master

????????????????-slave1

????????????????-slave2

  • 主從從

????????????????-master

????????????????-slave1

????????????????-slave2

  • 互為主從(雙主結構)

????????????????-master

????????????????-slave

2.一主多從配置

1)準備環境

master:192.168.1.11

slave1:192.168.1.12

slave2:192.168.1.13

2)主服務器數據備份

[root@mysql1 ~]# mysqldump -uroot -pNSD2021@tedu.cn --master-data nsd2021 > /root/fullbackup.sql

3)從服務器配置

  • 修改配置文件

[root@mysql3 ~]# vim /etc/my.cnf [mysqld] server_id=13 ... ... [root@mysql3 ~]# systemctl restart mysqld
  • 同步數據

# 主服務器拷貝完全備份數據到從服務器 [root@mysql1 ~]# scp fullbackup.sql 192.168.1.13:/root# 創建數據庫 [root@mysql3 ~]# mysql -uroot -pNSD2021@tedu.cn mysql> create database nsd2021 default charset utf8mb4;# 還原數據 [root@mysql3 ~]# mysql -uroot -pNSD2021@tedu.cn nsd2021 < fullbackup.sql
  • 配置從服務器

# 獲取日志文件名和偏移量 [root@mysql3 ~]# grep master11 fullbackup.sql CHANGE MASTER TO MASTER_LOG_FILE='master11.000001', MASTER_LOG_POS=175286;# 配置同步 [root@mysql3 ~]# mysql -uroot -pNSD2021@tedu.cn mysql> change master to-> master_host="192.168.1.11",-> master_user="repluser",-> master_password="NSD2021@tedu.cn",-> master_log_file="master11.000001",-> master_log_pos=175286; Query OK, 0 rows affected, 2 warnings (0.16 sec)# 啟動從庫 mysql> start slave;# 查看狀態 mysql> show slave status\G

4) 客戶端驗證

  • 客戶端連接主服務器更新數據,查看從服務器同步內容

3.主從從配置

1)環境準備

????????master:192.168.1.13

????????slave1:192.168.1.14

????????slave2:192.168.1.15

2)主服務器配置

  • 將一主多從配置中的從服務器192.168.1.13改為主服務器

[root@mysql3 ~]# cd /var/lib/mysql [root@mysql3 mysql]# rm -f master.info relay-log.info mysql3-relay-bin.* [root@mysql3 ~]# systemctl restart mysqld [root@mysql3 ~]# mysql -uroot -pNSD2021@tedu.cn mysql> show slave status; Empty set (0.00 sec)
  • 創建用于同步的用戶

mysql> grant replication slave on *.* to repluser@'%' identified by 'NSD2021@tedu.cn';
  • 修改配置文件

[root@mysql3 ~]# vim /etc/my.cnf [mysqld] server_id=13 log-bin=master13 ... ...
  • 重啟并驗證

[root@mysql3 ~]# systemctl restart mysqld [root@mysql3 ~]# ls /var/lib/mysql/master13.* /var/lib/mysql/master13.000001 /var/lib/mysql/master13.index

3)從服務器配置

  • 由于該機器也是192.168.1.14的主服務器,所以它也需要有主服務器的配置

  • 創建用于同步的用戶

[root@mysql4 ~]# mysql -uroot -pNSD2021@tedu.cn mysql> grant replication slave on *.* to repluser@'%' identified by 'NSD2021@tedu.cn';
  • 修改配置文件

[root@mysql4 ~]# vim /etc/my.cnf [mysqld] server_id = 14 log-bin = master14 log_slave_updates # 在主上同步過來的日志,寫到自己的binlog一份 ... ... [root@mysql4 ~]# systemctl restart mysqld
  • 從主服務器同步數據

# 主服務器備份數據 [root@mysql3 ~]# mysqldump -uroot -pNSD2021@tedu.cn --master-data nsd2021 > /root/fullbackup.sql[root@mysql3 ~]# scp fullbackup.sql 192.168.1.14:/root/ # 從服務器恢復數據 mysql> create database nsd2021 default charset utf8mb4; [root@mysql4 ~]# mysql -uroot -pNSD2021@tedu.cn nsd2021 < /root/fullbackup.sql
  • 查看binlog日志名和偏移量

[root@mysql4 ~]# grep master13 /root/fullbackup.sql CHANGE MASTER TO MASTER_LOG_FILE='master13.000001', MASTER_LOG_POS=154;
  • 在從服務器上配置同步的主庫信息

mysql> change master to-> master_host="192.168.1.13",-> master_user="repluser",-> master_password="NSD2021@tedu.cn",-> master_log_file="master13.000001",-> master_log_pos=154; Query OK, 0 rows affected, 2 warnings (0.15 sec)mysql> start slave;mysql> show slave status\G

4)從服務器192.168.1.15配置

  • 修改配置文件

[root@mysql5 ~]# vim /etc/my.cnf [mysqld] server_id = 15 ... ...[root@mysql5 ~]# systemctl restart mysqld
  • 從主服務器同步數據

# 主服務器備份數據 [root@mysql4 ~]# mysqldump -uroot -pNSD2021@tedu.cn --master-data nsd2021 > /root/fullbackup.sql[root@mysql4 ~]# scp fullbackup.sql 192.168.1.15:/root/# 從服務器恢復數據 mysql> create database nsd2021 default charset utf8mb4; [root@mysql5 ~]# mysql -uroot -pNSD2021@tedu.cn nsd2021 < /root/fullbackup.sql
  • 查看binlog日志名和偏移量

[root@mysql5 ~]# grep master14 /root/fullbackup.sql CHANGE MASTER TO MASTER_LOG_FILE='master14.000001', MASTER_LOG_POS=173457;
  • 在從服務器上配置同步的主庫信息

mysql> change master to-> master_host="192.168.1.14",-> master_user="repluser",-> master_password="NSD2021@tedu.cn",-> master_log_file="master14.000001",-> master_log_pos=173457; Query OK, 0 rows affected, 2 warnings (0.15 sec)mysql> start slave;mysql> show slave status\G

5)客戶端驗證

  • 在主服務器上添加授權用戶,允許客戶端進行連接

[root@mysql3 ~]# mysql -uroot -pNSD2021@tedu.cn mysql> grant all on nsd2021.* to admin@'%' identified by 'NSD2021@tedu.cn';
  • 客戶端連接主服務器更新數據

[root@mysql3 ~]# mysql -h192.168.1.13 -uadmin -pNSD2021@tedu.cn mysql> use nsd2021; mysql> insert into departments(dept_name) values('sales10');
  • 查看從服務器同步內容

[root@mysql4 ~]# mysql -uroot -pNSD2021@tedu.cn mysql> use nsd2021; mysql> select * from departments where dept_name like 'sales1_'; +---------+-----------+ | dept_id | dept_name | +---------+-----------+ | 13 | sales10 | +---------+-----------+ 1 row in set (0.00 sec)[root@mysql5 ~]# mysql -uroot -pNSD2021@tedu.cnmysql> use nsd2021; mysql> select * from departments where dept_name like 'sales1_'; +---------+-----------+ | dept_id | dept_name | +---------+-----------+ | 13 | sales10 | +---------+-----------+ 1 row in set (0.00 sec)

4.主主模式

1)準備環境

????????master:192.168.1.16

????????slave:192.168.1.17

將192.168.1.16作為主服務器

2)服務器配置

[root@mysql6 ~]# vim /etc/my.cnf [mysqld] server_id = 16 log_bin = master16 ... ...[root@mysql6 ~]# systemctl restart mysqldmysql> grant replication slave on *.* to repluser@'%' identified by 'NSD2021@tedu.cn';# 查看日志文件和偏移量 mysql> show master status; +-----------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-----------------+----------+--------------+------------------+-------------------+ | master16.000002 | 701 | | | | +-----------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)

3)從服務器配置

[root@mysql7 ~]# vim /etc/my.cnf [mysqld] server_id = 17 ... ...[root@mysql7 ~]# systemctl restart mysqld[root@mysql7 ~]# mysql -uroot -pNSD2021@tedu.cn mysql> change master to-> master_host="192.168.1.16",-> master_user="repluser",-> master_password="NSD2021@tedu.cn",-> master_log_file="master16.000002",-> master_log_pos=701; Query OK, 0 rows affected, 2 warnings (0.65 sec)mysql> start slave; mysql> show slave status \G將192.168.1.17作為主服務器

4)服務器配置

[root@mysql7 ~]# vim /etc/my.cnf [mysqld] server_id = 17 log_bin = master17 ... ...[root@mysql7 ~]# systemctl restart mysqldmysql> grant replication slave on *.* to repluser@'%' identified by 'NSD2021@tedu.cn';# 查看日志文件和偏移量 mysql> show master status; +-----------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-----------------+----------+--------------+------------------+-------------------+ | master17.000001 | 441 | | | | +-----------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)

5)從服務器配置

[root@mysql6 ~]# mysql -uroot -pNSD2021@tedu.cn mysql> change master to-> master_host="192.168.1.17",-> master_user="repluser",-> master_password="NSD2021@tedu.cn",-> master_log_file="master17.000001",-> master_log_pos=441; Query OK, 0 rows affected, 2 warnings (0.31 sec)mysql> start slave;mysql> show slave status\G驗證

6)以192.168.1.16作為主進行驗證

# 主服務器上創建數據庫和表 [root@mysql6 ~]# mysql -uroot -pNSD2021@tedu.cn mysql> create database mydb; mysql> use mydb; mysql> create table students(id int primary key, name varchar(20));# 從服務器上查看 [root@mysql7 ~]# mysql -uroot -pNSD2021@tedu.cn mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mydb | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec)mysql> use mydb; mysql> show tables; +----------------+ | Tables_in_mydb | +----------------+ | students | +----------------+ 1 row in set (0.00 sec)

7)以192.168.1.17作為主進行驗證

# 主服務器上添加用戶 [root@mysql7 ~]# mysql -uroot -pNSD2021@tedu.cn mysql> use mydb; mysql> insert into students values(1, 'tom');# 從服務器查看 [root@mysql6 ~]# mysql -uroot -pNSD2021@tedu.cn mysql> use mydb; mysql> select * from students; +----+------+ | id | name | +----+------+ | 1 | tom | +----+------+ 1 row in set (0.00 sec)

四.復制模式

1.復制的概述

異步復制(Asynchronous replication)

  • 主服務器執行完一次事務后,立即將結果返給客戶端,不關心從服務器是否已經同步數據。

半同步復制(Semisynchronous replication)

  • 介于異步復制和全同步復制之間

  • 主服務器在執行完一次事務后,等待至少一臺從服務器同步數據完成,才將結果返回給客戶端

2.模式配置

1)查看是否允許動態加載模塊

mysql> show variables like 'have_dynamic_loading'; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | have_dynamic_loading | YES | +----------------------+-------+ 1 row in set (0.01 sec)

2)主主模式下啟用半同步復制
?

# 在兩臺服務器上修改配置文件 [root@mysql6 ~]# vim /etc/my.cnf [mysqld] server_id = 16 log_bin = master16 plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" rpl_semi_sync_master_enabled=1 rpl_semi_sync_slave_enabled=1 ... ... [root@mysql6 ~]# systemctl restart mysqld[root@mysql7 ~]# vim /etc/my.cnf [mysqld] server_id = 17 log_bin = master17 plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" rpl_semi_sync_master_enabled=1 rpl_semi_sync_slave_enabled=1 [root@mysql7 ~]# systemctl restart mysqld

3)查看結果

mysql> select plugin_name, plugin_status from information_schema.plugins where plugin_name like '%semi%'; +----------------------+---------------+ | plugin_name | plugin_status | +----------------------+---------------+ | rpl_semi_sync_master | ACTIVE | | rpl_semi_sync_slave | ACTIVE | +----------------------+---------------+ 2 rows in set (0.01 sec)

總結

以上是生活随笔為你收集整理的MySQL主从同步(复制)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。