mysql5.7主从同步 ubuntu 看这一贴就够了 个人亲测

【实操笔记】MySQL 5.7主从同步功能实现

实现环境:

| System   | mysql      |  ip        |

|主ubuntu  | mysql-5.7.24   | 10.192.209.122 |

|从ubuntu    | mysql-5.7.39   | 10.192.209.43   |

注:从服务器的mysql版本最好和主服务器相同,或者大于主服务器版本

MySQL主从同步的实现部分:

首先是Master(主节点)的配置:

#主Master服务器配置----------------------------------------------------------------------------------------------------------------------- 

1.停掉slave端数据库服务

/etc/init.d/mysql stop
或者service mysqld stop

2.修改配置文件:

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
1.主数据库(Master)配置:
#***********************************master my.cnf配置开始******************************
#主库日志记录文件位置或名称前缀
log_bin = /var/lib/mysql/mylog-bin.log
#同步日志记录的频率,1为每条都记录,安全但效率低
sync_binlog = 1
#server的id,不能与相同id的mysql主从连接
server-id=1
#同步数据库,如果多库,就以此格式另写几行即可
binlog-do-db=test
#无需同步的数据库,以下几行基本一样,无需改动
binlog-ignore-db = cluster
binlog-ignore-db = mysql
binlog-ignore-db = performance_schema
binlog-ignore-db = information_schema

#mysql复制模式,三种:SBR(基于sql语句复制),RBR(基于行的复制),MBR(混合模式复制)
#混合模式复制
binlog_format=MIXED
#binlog过期清理时间
expire_logs_days=7
#binlog每个日志文件大小
max_binlog_size=20M
#*********************master my.conf配置文件结束*****************************************


  binlog_do_db            = your databasename(需要主从同步的数据库)
  log-slave-updates=1    #事件自动更新到日志中  
  sync_binlog=1          #日志文件同步到磁盘上   

2.登陆mysql执行

mysql> show master status;
+------------------+----------+--------------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB       | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------------+------------------+-------------------+
| mysql-bin.000006 |     787 | weblinux_scheduler |                  |                   |
+------------------+----------+--------------------+------------------+-------------------+
1 row in set (0.01 sec)

这个File:mysql-bin.000006 和Position787一会儿要在从库用到

注意:每次修改数据时这两个值都会改变,所以在查看了这两个值之后,不要操作主服务器、直接到从服务器配置完成之后,否则这个值对应不上会同步失败

3.重启mysql服务,mysql命令行执行:

show master status;#记录文件名以及紧跟的当前行数数字

4.创建并授权用户,后两个slave分别是用户名和密码

  注意:此处ip是slave端的ip,非本机ip,本人因为这个错误浪费好多时间。

grant replication slave ,replication client on *.* to slave@'10.192.209.43' identified by "slave";
flush privileges; #权限修改立即生效
flush tables with read lock; #锁定数据库为只读,确保备份数据一致性

5.退出mysql命令行,执行备份命令

#备份当前所有数据库,可以参考备份单库
mysqldump -u root -p --all-databases --master-data > mysql_bak.sql

----------此处执行从服务器相关配置全部完成再执行下面2步--------
6.从服务器启动slave(前提是配置好从服务器)
7.从服务器启动完毕后关闭表锁

unlock tables;

#从服务器的配置----------------------------------------------------------------------------------------------------------------------- 

1.停掉slave端数据库服务

/etc/init.d/mysql stop
或者service mysqld stop

2.修改配置文件:

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
#从数据库(Slave)配置:
#***********************************slave my.cnf配置开始******************************
#从库日志记录文件位置或名称前缀
log_bin = /var/lib/mysql/mylog-bin.log
#同步日志记录的频率,1为每条都记录,安全但效率低
sync_binlog = 1
#server的id,不能与相同id的mysql主从连接
server-id=2
#从库日志忽略的数据库名称,不记录
#这里记录从库的binlog是为了安全,如果觉得没必要,可以去掉从库binlog的配置
binlog-ignore-db = cluster
binlog-ignore-db = mysql
binlog-ignore-db = performance_schema
binlog-ignore-db = information_schema
#此处添加需要同步的数据库名称,那么它会只接收这个数据库的信息,多个数据库需同步按照此格式另写几行即可
#这里同步数据有两种思路,一种是主服务器只发从库需要的,在主库指定;一种是主服务器把所有数据同步过来,从库按需过滤接收
#为了让配置更详细些,此处配置了从库过滤接收的配置
replicate-do-db=test
#忽略接收的库名
replicate-ignore-db = cluster
replicate-ignore-db = mysql
replicate-ignore-db = performance_schema
replicate-ignore-db = information_schema
#跳过所有错误继续
slave-skip-errors=all
#设置延时时间
slave-net-timeout=60

#mysql复制模式,三种:SBR(基于sql语句复制),RBR(基于行的复制),MBR(混合模式复制)
binlog_format=MIXED #混合模式复制
expire_logs_days=7 #binlog过期清理时间
max_binlog_size=20M #binlog每个日志文件大小
#***********************************slave my.cnf配置结束******************************
3.保存退出:wq
4.启动mysqld服务

/etc/init.d/mysql start
或service mysqld start

5.导入主服务器数据库备份的数据

mysqldump -u root -p your databasename < ~/mysql_bak.sql

source mysql_bak.sql(如果你的数据库是新建的要用这条命令,我执行上面的命令始终没成功,又浪费了很多时间)

6.在从服务器slave端的mysql>指定master端的相关参数(登陆mysql后执行)

mysql>CHANGE MASTER TO
MASTER_HOST='10.192.209.122',
MASTER_USER='slave',
MASTER_PASSWORD='slave',
MASTER_LOG_FILE='mysql-bin.000006',
MASTER_LOG_POS=787;

注:最后两行是之前在主服务器show master status 所记录的数据

  如果之前已经启动了一个slave进程,那么以上的命令会失效,并提示stop slave first,所以先stop slave; 然后重试

7.启动slave

start slave;
show slave status\G #注意,没有分号

 输出如下,显示两个都为yes即成功,可以测试一下

mysql> show slave status;

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.192.209.122
                  Master_User: replication
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 787
               Relay_Log_File: mysql-relay-log.000004
                Relay_Log_Pos: 441
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 52360
              Relay_Log_Space: 597
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
"""

8.去主服务器开启表只读锁

unlock tables;

--------------------------------实现部分到此结束--------------------------------------

注:从服务器的mysql版本最好和主服务器相同,或者大于主服务器版本

参考文献

https://www.cnblogs.com/hellxz/p/8378601.html

http://www.cnblogs.com/kylinlin/p/5258719.html

mysql修改用户名密码方法

https://www.cnblogs.com/mmx8861/p/9062363.html

导致lave_IO_Running 为connecting 的原因主要有以下 3 个方面

https://blog.csdn.net/anzhen0429/article/details/76599009

https://www.cnblogs.com/zjoch/p/5584155.html

================================续:双向同步=================================

配置MySQL主从双向同步

原文地址:http://www.cnblogs.com/zhongshengzhen/

原主数据库:192.168.137.33

原从数据库:192.168.137.197

需要先阅读并操作:http://www.cnblogs.com/zhongshengzhen/p/4919454.html

1、从数据库创建同步用户,将主数据库作为从库

 

从数据库10.192.209.43上执行:

1.创建主从复制的帐号,将曾经的主库10.192.209.122作为从库:

#mysql> GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO backup@'192.168.137.33' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)

#mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.0000011 |      121 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

2、原主数据库192.168.137.33上执行

#mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

#mysql> CHANGE MASTER TO

     MASTER_HOST='192.168.137.197',

     MASTER_USER='backup',
     MASTER_PASSWORD='123456',
     MASTER_PORT=3306,
     MASTER_LOG_FILE='mysql-bin.000011',
     MASTER_LOG_POS=121,
     MASTER_CONNECT_RETRY=10;

Query OK, 0 rows affected (0.02 sec)

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

#mysql> show slave status\G;

猜你喜欢

转载自blog.csdn.net/u011689371/article/details/89358252