MySQL 主从复制

一 binlog日志方式

1. 在主服务器上,必须启用二进制日志记录并配置唯一的服务器ID。需要重启服务器。

-编辑主服务器的配置文件 my.cnf
    [root@localhost ~]# vim /etc/my.cnf

-添加如下内容
    [mysqld]
    log-bin=/var/log/mysql/mysql-bin               二进制日志存储目录
    server-id=1                                    主从复制id

-创建日志存储目录并赋予mysql用户权限
    [root@localhost ~]# mkdir /var/log/mysql
    [root@localhost ~]# chown mysql.mysql /var/log/mysql

-重启mysql服务
    [root@localhost ~]# systemctl restart mysqld

-确保在主服务器上 skip_networking 选项处于 OFF 关闭状态, 这是默认值。如果是启用的,则从站无法与主站通信,并且复制失败。
    mysql> show variables like '%skip_networking%';
    +-----------------+-------+
    | Variable_name   | Value |
    +-----------------+-------+
    | skip_networking | OFF   |
    +-----------------+-------+

注意:
如果省略server-id(或将其显式设置为默认值0),则主服务器拒绝来自从服务器的任何连接。

为了在使用带事务的InnoDB进行复制设置时尽可能提高持久性和一致性,
应该在主服务器 my.cnf文件中使用以下配置项:
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1

2. 应该创建一个专门用于复制数据的用户

每个从服务器需要使用MySQL 主服务器上的用户名和密码连接到主站。
例如,计划使用用户 repl 可以从任何主机上连接到主服务器上进行复制操作, 并且用户 repl 仅可以使用复制的权限。

在 主服务器 上执行如下操作
-创建用户repl可以从任意来源访问
    mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'Cc@123';

-给予用户repl权限
    mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' identified by 'Cc@123';

-在从服务器上测试该用户
    mysql -urepl -p'Cc@123' -h 主服务器地址;

replication slave:拥有此权限可以查看从服务器,从主服务器读取二进制日志。

3. 从服务器配置

3.1 主服务器中无数据
-编辑从服务器的配置文件 my.cnf 
    [root@localhost ~]# vim /etc/my.cnf

-添加如下内容
    [mysqld]
    server-id=2

-重启mysql服务
    [root@localhost ~]# systemctl restart mysqld

-查看主服务器的二进制日志的名称
    mysql> show master status\G

-配置连接到主服务器的相关信息
    mysql> CHANGE MASTER TO
        -> MASTER_HOST='master',                         //主服务器ip
        -> MASTER_USER='repl',                           //主服务器用户
        -> MASTER_PASSWORD='Cc@123',                     //用户密码
        -> MASTER_PORT=3306,                             //端口
        -> MASTER_LOG_FILE='mysql-bin.000001',           //binlog日志文件名称
        -> MASTER_LOG_POS=599,                           //日志位置
        -> ;

-启动从服务器的复制线程
    mysql> start slave;

-检查是否成功
    mysql> show slave status\G
输出结果中应该看到 I/O 线程和 SQL 线程都是 YES, 就表示成功。
slave_IO_Running:YES
slave_SQL_Running:YES
到此配置完成
3.2 主服务器中有数据

如果在启动复制之前有现有数据需要与从属设备同步,请保持客户端正常运行,以便锁定保持不变。这可以防止进行任何进一步的更改,以便复制到从站的数据与主站同步。

-在主服务器中导出现有的数据
    mysqldump  -u用户名  -p密码 -A --master-data > alldb.sql;      
        -如果不使用 --master-data 参数,则需要手动锁定单独会话中的所有表。

-传输备份数据给从服务器
    scp  alldb.sql root@从服务器地址:/存放目录

-导入数据到从服务器
    mysql -u用户 -p'密码'  < 备份的路径/备份文件名

-编辑从服务器的配置文件 my.cnf 
    [root@localhost ~]# vim /etc/my.cnf

-添加如下内容
    [mysqld]
    server-id=2

-重启从服务器mysql服务
    [root@localhost ~]# systemctl restart mysqld

-查看主服务器的二进制日志的名称
    此处也可以在备份的数据里查看
    mysql> show master status\G

-配置连接到主服务器的相关信息
    mysql> CHANGE MASTER TO
        -> MASTER_HOST='master',                         //主服务器ip
        -> MASTER_USER='repl',                           //主服务器用户
        -> MASTER_PASSWORD='Cc@123',                     //用户密码
        -> MASTER_PORT=3306,                             //端口
        -> MASTER_LOG_FILE='mysql-bin.000001',           //binlog日志文件名称
        -> MASTER_LOG_POS=599,                           //日志位置
        -> ;

-启动从服务器的复制线程
    mysql> start slave;

-检查是否成功
    mysql> show slave status\G
输出结果中应该看到 I/O 线程和 SQL 线程都是 YES, 就表示成功。
slave_IO_Running:YES
slave_SQL_Running:YES
到此配置完成
4. 在从服务器上暂停复制
-要停止从主服务器处理二进制日志
    mysql> STOP SLAVE;

-当复制停止时,从I / O线程停止从主二进制日志读取事件并将它们写入中继日志,并且SQL线程停止从中继日志读取事件并执行它们。您可以通过指定线程类型单独暂停I / O或SQL线程:
    mysql> STOP SLAVE IO_THREAD;

-要再次开始执行,请使用以下
    mysql> START SLAVE;

-要启动特定线程,请指定线程类型:
    mysql> START SLAVE IO_THREAD;
    mysql> START SLAVE SQL_THREAD;
5. 主主同步
-masterA设置(192.168.188.2)
    # vim /etc/my.cnf                //编辑my.cnf文件
    server-id=2 //增加server-id为2,一般为自己ip
    log_bin=test01 //设置log_bin名为test01

    # systemctl restart mysqld        //重启mysql服务

    # mysql -uroot -p123456            //登录mysql,不要照抄,-u后面是账号,-p后面是密码
    > grant replication slave on *.* to 'repl'@'192.168.188.3' identified by '123456';        //创建mysql账号repl,只容许指定ip访问,也可以指定ip范围192.168.188.%,其中%为通配符,表示所有;
    > flush privileges;            //刷新授权表信息
    > flush tables with read lock;    //锁定数据库表暂时无法写服务;
    > show master status;        //查看binlog文件值与pos值
    > stop slave;            //关闭同步


-masterB设置(192.168.188.3)
    # vim /etc/my.cnf
    server-id=3                        //增加server-id为3,一般为自己ip
    log_bin=test02                    //设置log_bin名为test02

    # systemctl restart mysqld        //重启mysql服务

    # mysql -uroot -p123456        //登录mysql
    > grant replication slave on *.* to 'repl'@'192.168.188.2' identified by '123456';              //创建用户,允许192.168.188.2登录本机器
    > flush privileges;                //刷新授权表
    > stop slave;                        //关闭同步
    > show master status;        //查看binlog文件值与pos值
    > change master to master_host='192.168.188.2', master_user='repl', master_password='123456', master_log_file='test01.000001', master_log_pos=664383;        //这里注意log_file与pos值都要对应对应A的show master status;值
    > start slave;        //开启同步


-masterA设置
    > change master to master_host='192.168.188.3', master_user='repl', master_password='123456', master_log_file='test02.000001', master_log_pos=664343;     //这里log_file与pos值写的必须是B上show master status;的值
    > start slave;                    //开启同步
    > unlock tables;                //解锁写

测试。如果提示uuid冲突,删掉auto.conf,重启。

二 GTID 基于事务ID复制

  • master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
  • slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
  • sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
  • 如果有记录,说明该GTID的事务已经执行,slave会忽略。
  • 如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。

1. 主服务器配置

-编辑主服务器的配置文件 my.cnf
    [root@localhost ~]# vim /etc/my.cnf

-添加如下内容
    [mysqld]
    log-bin=/var/log/mysql/mysql-bin       二进制日志存储目录
    server-id=1                            主从复制id
    gtid_mode = ON                         开启gtid
    enforce_gtid_consistency=1             强制gtid

-创建日志存储目录并赋予mysql用户权限
    [root@localhost ~]# mkdir /var/log/mysql
    [root@localhost ~]# chown mysql.mysql /var/log/mysql

-重启mysql服务
    [root@localhost ~]# systemctl restart mysqld

-创建用户repl可以从任意来源访问
    mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'Cc@123';

-给予用户repl权限
    mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' identified by 'Cc@123';

-在从服务器上测试该用户
    mysql -urepl -p'Cc@123' -h 主服务器地址;

replication slave:拥有此权限可以查看从服务器,从主服务器读取二进制日志。

2. 从服务器配置

-编辑从服务器的配置文件 my.cnf 
    [root@localhost ~]# vim /etc/my.cnf

-添加如下内容
    [mysqld]
    server-id=2
    gtid_mode = ON
    enforce_gtid_consistency=1

-重启mysql服务
    [root@localhost ~]# systemctl restart mysqld

-配置连接到主服务器的相关信息
    mysql> CHANGE MASTER TO
        -> MASTER_HOST='master',                         //主服务器ip
        -> MASTER_USER='repl',                           //主服务器用户
        -> MASTER_PASSWORD='Cc@123',                     //用户密码
        -> master_auto_position=1;

-启动从服务器的复制线程
    mysql> start slave;

-检查是否成功
    mysql> show slave status\G
输出结果中应该看到 I/O 线程和 SQL 线程都是 YES, 就表示成功。
slave_IO_Running:YES
slave_SQL_Running:YES
到此配置完成
开启 GTID 后的导出导入数据的注意点

数据导出时需要添加--set-gtid-purged=OFF参数.
mysqldump -u用户名 -p密码 -A --set-gtid-purged=OFF > alldb.sql;

你可能感兴趣的:(MySQL 主从复制)