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.sql2.主服務器配置
# 修改配置文件 [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;
3.配置從服務器
1)修改配置文件
[root@mysql2 ~]# vim /etc/my.cnf [mysqld] server_id = 12 ... ...[root@mysql2 ~]# systemctl restart mysqld2)如果主服務器上已有一段時間的數據,需要將主服務器數據完全同步到從服務器。
# 主服務器備份數據 [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 ... ...-
驗證:查看從服務器上的相關文件
| 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)驗證主從同步效果
-
在主服務器上添加授權用戶,允許客戶端進行連接
-
客戶端連接主服務器,更新數據
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.sql3)從服務器配置
-
修改配置文件
-
同步數據
-
配置從服務器
4) 客戶端驗證
-
客戶端連接主服務器更新數據,查看從服務器同步內容
3.主從從配置
1)環境準備
????????master:192.168.1.13
????????slave1:192.168.1.14
????????slave2:192.168.1.15
2)主服務器配置
-
將一主多從配置中的從服務器192.168.1.13改為主服務器
-
創建用于同步的用戶
-
修改配置文件
-
重啟并驗證
3)從服務器配置
-
由于該機器也是192.168.1.14的主服務器,所以它也需要有主服務器的配置
-
創建用于同步的用戶
-
修改配置文件
-
從主服務器同步數據
-
查看binlog日志名和偏移量
-
在從服務器上配置同步的主庫信息
4)從服務器192.168.1.15配置
-
修改配置文件
-
從主服務器同步數據
-
查看binlog日志名和偏移量
-
在從服務器上配置同步的主庫信息
5)客戶端驗證
-
在主服務器上添加授權用戶,允許客戶端進行連接
-
客戶端連接主服務器更新數據
-
查看從服務器同步內容
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)主主模式下啟用半同步復制
?
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主从同步(复制)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mysql索引,用户及授权(root密码
- 下一篇: Mysql数据读写分离(多实例配置)