MySQL 主从复制
MySQL 主从复制:
(1) MySQL Replication 称为 MySQL 主从复制,即在主库上写数据,从库也会跟着实时同步
(2) MySQL 主从基于 binlog (二进制格式的日志),主库上必须开启 binlog 才能进行主从复制
(1) 主库将更改操作的SQL语句记录到 binlog 日志
(2) 从库将主库的 binlog 日志同步到本机并记录在 relaylog(中继日志)
(3) 从库根据 relaylog 日志里的SQL语句按顺序执行,达到主从同步
(1) 主库上有一个 log dump 线程,用来和从库的 I/O 线程传递 binlog 日志
(2) 从库上有两个线程,其中 I/O 线程用来同步主库的 binlog 日志并记录到 relaylog 中,另外一个SQL线程用来将 relaylog 日志里的SQL语句按顺序执行
配置 MySQL 主库(192.168.216.128):
[root@localhost ~]$ mysqldump -uroot -proot -A > /tmp/all.sql # 做主从同步前,必须先保证主库和从库数据一致 [root@localhost ~]$ scp /tmp/all.sql root@192.168.216.132:/tmp/ # 备份所有库,发送到从库,然后在从库导入这些库
[root@localhost ~]$ vim /etc/my.cnf # 修改配置文件 [mysqld] server-id = 1 # 用于标识 binlog 日志是由哪个 server 写入的,主从不能一致 log_bin = mysql-binlog # 记录二进制日志,mysql-binlog 作为日志的前缀名
[root@localhost ~]$ /etc/init.d/mysqld restart # 重启 MySQL 服务
mysql> grant replication slave on *.* to 'repl'@'192.168.216.132' identified by '123456'; # 创建用于主从复制的用户,其中的IP是从库IP Query OK, 0 rows affected (0.04 sec) mysql> flush privileges; # 刷新用户权限 Query OK, 0 rows affected (0.07 sec) mysql> flush tables with read lock; # 锁表,不让数据写入,等做完主从同步再解锁 Query OK, 0 rows affected (0.00 sec) mysql> show master status; # 查看主库状态,记住下面的值,等下在从库的时候会用到 +---------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +---------------------+----------+--------------+------------------+-------------------+ | mysql-binlog.000001 | 411 | | | | +---------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) mysql> quit Bye
配置 MySQL 从库(192.168.216.132):
[root@localhost ~]$ vim /etc/my.cnf # 修改配置文件,server id 不能与主库一致 [mysqld] server-id = 2
[root@localhost ~]$ /etc/init.d/mysqld restart # 重启 MySQL 服务
mysql> stop slave; # 先停止从库 Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> change master to master_host='192.168.216.128', # 配置主库相关的信息 > master_user='repl', master_password='123456', > master_log_file='mysql-binlog.000001', master_log_pos=411; Query OK, 0 rows affected, 2 warnings (0.11 sec) mysql> start slave; # 启动从库 Query OK, 0 rows affected (0.06 sec) mysql> show slave status\G # 查看从库的状态,如果下面两个线程的值为Yes,则表明主从复制配置成功 Slave_IO_Running: Yes Slave_SQL_Running: Yes
mysql> unlock tables; # 主从复制配置成功后,记得在主库上解锁表,让其恢复可写
Query OK, 0 rows affected (0.00 sec)
测试 MySQL 主从同步:
[root@localhost ~]$ mysql -uroot -p'123456' # 在 master 上创建一些数据库 mysql> create database test1; mysql> create database test2; mysql> create database test3;
mysql> show databases; # 在 slave 上查询是否实时同步 +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test1 | | test2 | | test3 | +--------------------+ 8 rows in set (0.04 sec)