• linux下mysql主从复制


    目标

    搭建两台MySQL服务器,一台作为主服务器,一台作为从服务器,实现主从复制

    环境

    主数据库: 192.168.1.39

    从数据库: 192.168.1.40

    mysql版本都是5.7.25, for linux

    数据库准备
    1. 保证两个数据库中的库和数据是一致的,自己从主数据库复制一个数据库就行啦
    2. 在主数据中创建一个同步账号(可不创建使用现有的),如果仅仅为了主从复制创建账号,只需要授予REPLICATION SLAVE权限。
    CREATE USER 'slave_user'@'%' IDENTIFIED BY '123456';
    GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
    
    • 1
    • 2
    配置主数据库
    1. 主库开启二进制日志(binary logging),并添加唯一的server-id(该id必须是1到2^23-1范围内的唯一值)
      2. 如果主服务器的二进制日志已经启用,关闭并重新启动之前应该对以前的二进制日志进行备份。重新启动后,应使用RESET MASTER语句清空以前的日志。
      3. 原因:master上对数据库的一切操作都记录在日志文件中,然后会把日志发给slave,slave接收到master传来的日志文 件之后就会执行相应的操作,使slave中的数据库做和master数据库相同的操作。所以为了保持数据的一致性,必须保证日志文件没有脏数据。
    2. vim /etc/my.cnf
    3. 在 [mysqld]下方添加如下配置
    # 主从复制 #
    log-bin=mysql-bin
    server-id=1
    binlog-do-db=test  #要同步多个数据库,就多加几个binlog-do-db=数据库名 
    binlog-do-db=test2  #要同步多个数据库,就多加几个binlog-do-db=数据库名 
    #binlog-ignore-db=mysql //要忽略的数据库
    innodb_flush_log_at_trx_commit=1
    sync_binlog=1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 重启mysql

    systemctl restart mysql

    1. 查看主服务器状态,登录主mysql后执行 show master status;查看
    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000001 |     2460 | test      |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注意:记录好File和Position,后面要用

    配置从数据库
    1. 从服务器,同理,要分配一个唯一的Server ID,需要关闭MySQL,修改好后再重启,我这里只加了server-id=2
    [mysqld]
    server-id=2
    #可以指定要复制的库
    #replicate-do-db=test-xxx #在master端不指定binlog-do-db,在slave端用replication-do-db来过滤
    #replicate-ignore-db=mysql #忽略的库
    #网上还有下面配置
    #relay-log=mysqld-relay-bin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. 配置从数据库连接主服务器的信息,登录mysql,这里就要用到上面记录好File和Position,其实这一步也可以放在my.cnf里面
    mysql> stop slave;
    mysql> CHANGE MASTER TO
    -> MASTER_HOST='192.168.1.39',
    -> MASTER_USER='slave_user',
    -> MASTER_PASSWORD='123456',
    -> MASTER_PORT=3306,
    -> MASTER_LOG_FILE='mysql-bin.000001',
    -> MASTER_LOG_POS=154;
    mysql> start slave;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    下面是可以直接复制使用的命令

    stop slave;

    CHANGE MASTER TO
    MASTER_HOST='192.168.1.39',
    MASTER_USER='slave_user',
    MASTER_PASSWORD='123456',
    MASTER_PORT=3306,
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=154;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    start slave;

    1. 查看状态
    mysql> show slave status\G;
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.1.39
                      Master_User: slave_user
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000001
              Read_Master_Log_Pos: 2460
                   Relay_Log_File: vmware40-relay-bin.000007
                    Relay_Log_Pos: 597
            Relay_Master_Log_File: mysql-bin.000001
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                ....
                Seconds_Behind_Master: 0 #表示已同步
                ....
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    错误

    1. Slave_SQL_Running: no 请重复执行以下内容,直至yes
    stop slave;
    set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
    start slave;
    
    
    • 1
    • 2
    • 3
    • 4
    1. 主从同步报错Fatal error: The slave I/O thread stops because master and slave have equal MySQL server
      • 原因:
        • mysql 5.6的复制引入了uuid的概念,各个复制结构中的server_uuid得保证不一样,但是查看到直接copy data文件夹后server_uuid是相同的,show variables like ‘%server_uuid%’;
      • 解决方法:
        • 找到data文件夹下的auto.cnf文件,修改里面的uuid值,保证各个db的uuid不一样,重启db即可(一般在/usr/local/mysql/data下,没有就自己find找下)
  • 相关阅读:
    基于PHP+MySQL员工电子考勤网站的设计与实现
    vue 使用Html2Canvas对元素截图 下载
    平衡搜索树——红黑树小记
    lua-web-utils和proxy程序示例
    【论文翻译】KLMo: Knowledge Graph Enhanced Pretrained Language Model with Fine-Grained Relationships
    [AI] LRTA*(K) 搜索算法
    HTML学生个人网站作业设计:个人主页博客web网页设计制作 (HTML+CSS) (1)
    【TODO】【ETH】以太坊16进制数据解码
    Python in Visual Studio Code 2023年9月更新
    【mia】rtcdn-draft 基于http的rtc订阅及mia实现
  • 原文地址:https://blog.csdn.net/wade1010/article/details/128138212