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)

 

 

 

 

 

 

    

posted @ 2019-02-20 18:37  孔雀东南飞  阅读(152)  评论(0编辑  收藏  举报