• Mysql之部分表主从搭建及新增表


    一、需求场景说明

      一般情况下我们配置mysql主从模式实现mysql整库的冗余或者高可用,实际应用场景中还会有只需要同步某库部分表。例如某库含有上百个表,总库大小几十上百G,我们在A/B两城之间搭建数据库主从,A/B两个数据中心之间是通过专线互联,带宽有限,部署在B城的应用实际上都只需要使用数据库的部分表,这种情况下我们就可以搭建mysql部分表主从来实现该需求。运行一段时间后随着业务的变化又需要新增部分表,总体结构还是部分表主从模式。博文实验环境如下:

    • 操作系统:centos7.6
    • mysql版本:5.7.32
    • mysql主:192.168.0.152
    • mysql从:192.168.0.153

    二、部分表主从场景搭建

      部分表主从搭建跟全库主从搭建大体步骤差不多,主要体现在从库的配置上。

    0、主从配置规划

      主从同步的数据库是testdb,testdb有10张表,同步其中的tb_0001至tb_0005。

    序号角色IP地址server-id
    1master192.168.0.152152
    2slave192.168.0.153153

    1、两台主机上分别安装mysql

      mysql应用安装此博文不再赘述,可以参考博文Shell脚本之一键安装mysql

    2、在主库上创建testdb

      我们首先在主库上创建一个testdb数据库实例,然后创建tb_0001-tb_0010十张表,此博文重点是模拟示例mysql部分表主从模式搭建,数据内容不是重点,我们采用复制的方式创建10张表。

    mysql> create database testdb;
    mysql> CREATE TABLE IF NOT EXISTS `tb_0001`(
        ->    `id` INT UNSIGNED AUTO_INCREMENT,
        ->    `title` VARCHAR(100) NOT NULL,
        ->    `author` VARCHAR(40) NOT NULL,
        ->    `submission_date` DATE,
        ->    PRIMARY KEY ( `id` )
        -> )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    Query OK, 0 rows affected (0.49 sec)
    ...
    
    mysql> show tables;
    +------------------+
    | Tables_in_testdb |
    +------------------+
    | tb_0001          |
    | tb_0002          |
    | tb_0003          |
    | tb_0004          |
    | tb_0005          |
    | tb_0006          |
    | tb_0007          |
    | tb_0008          |
    | tb_0009          |
    | tb_0010          |
    +------------------+
    10 rows in set (0.01 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    3、创建主从同步账户

    mysql> create user bak@‘192.168.0.%’ identified by ‘Bak!1234’;
    Query OK, 0 rows affected (0.01 sec)
    mysql> GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO bak@‘192.168.0.%’;
    Query OK, 0 rows affected (0.07 sec)

    4、修改主节点my.cnf配置

    [wuhs@s152 mysql]$ vim my.cnf
    #添加如下部分配置到mysql的配置文件中,然后重启mysqld服务
    #mysql-master config
    server-id=152
    log_bin=mysql-bin
    log_slave_updates
    binlog-do-db=testdb
    binlog-ignore-db=mysql
    binlog_format=MIXED
    #配置修改完成后重启mysqld服务

    4、备份主库testdb需要同步的表

      使用–single-transaction 可以保证在备份过程中,整个备份集的数据一致性。-master-data=2参数可以记录binlog日志POS位置,用于主从配置。

    [wuhs@s152 mysql]$ mysqldump --single-transaction --master-data=2 testdb tb_0001 tb_0002 tb_0003 tb_0004 tb_0005 -uroot -p -h 127.0.0.1 > /tmp/5.sql
    Enter password:
    [wuhs@s152 mysql]$ mysql> show master status\G
    *************************** 1. row ***************************
    File: mysql-bin.000001
    Position: 154
    Binlog_Do_DB: testdb
    Binlog_Ignore_DB: mysql
    Executed_Gtid_Set:
    1 row in set (0.00 sec)

    5、从库导入testdb备份

    #主节点上将备份文件拷贝到从节点
    [wuhs@s152 mysql]$ scp /tmp/5.sql 192.168.0.153:/tmp/
    wuhs@192.168.0.153’s password:
    5.sql
    #从库上创建testdb并导入5张表备份数据
    mysql> create database testdb;
    Query OK, 1 row affected (0.00 sec)

    mysql> use testdb;
    Database changed
    mysql> source /tmp/5.sql;
    Query OK, 0 rows affected (0.00 sec)

    mysql> show tables;
    ±-----------------+
    | Tables_in_testdb |
    ±-----------------+
    | tb_0001 |
    | tb_0002 |
    | tb_0003 |
    | tb_0004 |
    | tb_0005 |
    ±-----------------+
    5 rows in set (0.00 sec)

    6、修改从节点my.cnf配置

    [wuhs@s153 mysql]$ vim my.cnf
    #添加如下部分配置到mysql的配置文件中,然后重启mysqld服务
    #mysql-slave config
    server-id=153
    log_bin=mysql-bin
    log_slave_updates
    binlog_format=MIXED
    binlog-do-db=testdb
    binlog-ignore-db=mysql
    replicate-do-table=testdb.tb_0001
    replicate-do-table=testdb.tb_0002
    replicate-do-table=testdb.tb_0003
    replicate-do-table=testdb.tb_0004
    replicate-do-table=testdb.tb_0005
    #修改完成后重启数据库

    6、在从库上配置主从

    mysql> change master to
    -> MASTER_HOST=‘192.168.0.152’,
    -> MASTER_USER=‘bak’,
    -> MASTER_PASSWORD=‘Bak!1234’,
    -> MASTER_PORT=3306,
    -> MASTER_LOG_FILE=‘mysql-bin.000002’, MASTER_LOG_POS=154;
    Query OK, 0 rows affected, 1 warning (0.84 sec)

    7、开启主从复制

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

    8、检查从库复制状态

    在这里插入图片描述

    9、更新数据测试验证

    #在主库上插入一条数据
    mysql> insert into tb_0001 (id,title,author,submission_date) values (2,“TCP/IP路由技术”,“葛建伟,吴剑章”,“2002-06-30”);
    Query OK, 1 row affected (0.10 sec)
    #在从库上检查数据更新
    mysql> select * from tb_0001;
    ±—±-------------------------------±----------------------±----------------+
    | id | title | author | submission_date |
    ±—±-------------------------------±----------------------±----------------+
    | 1 | 网络工程师的python之路 | 王印 | 2021-07-01 |
    | 2 | TCP/IP路由技术 | 葛建伟,吴剑章 | 2002-06-30 |
    ±—±-------------------------------±----------------------±----------------+
    2 rows in set (0.00 sec)

    三、部分表主从模式中途新增表

      在部分表主从模式场景中,可能会出现运行一段时间后同步的表需要更新,比如新增一个表。此博文以新增tb_0006表为例介绍说明。

    1、主库上锁表

    #在主库上主动执行锁表操作是为了有时间在从库上执行停止主从操作。实际上第三步使用–single-transaction --master-data=2参数会执行锁表操作。
    mysql> flush tables with read lock;
    Query OK, 0 rows affected (0.00 sec)

    2、在从库上停止主从

    mysql> stop slave;

    3、备份待新增表tb_0006

    [wuhs@s152 mysql]$ mysqldump --single-transaction --master-data=2 testdb tb_0006 -uroot -p -h 127.0.0.1 > /tmp/tb_0006.sql
    Enter password:
    [wuhs@s152 mysql]$ ll /tmp/ |grep 0006
    -rw-rw-r–. 1 wuhs wuhs 2234 7月 25 15:55 tb_0006.sql

    4、主库上解除锁表

    #实际上在上一步操作中使用了–single-transaction --master-data=2参数,在备份完成后也会执行解除锁表的操作。
    mysql> unlock tables;
    Query OK, 0 rows affected (0.00 sec)

    5、将备份表导入到从库

    #将备份文件上传到从库主机
    [wuhs@s152 mysql]$ scp /tmp/tb_0006.sql 192.168.0.153:/tmp/
    wuhs@192.168.0.153’s password:
    tb_0006.sql 100% 2234 1.2MB/s 00:00
    #在从库上导入tb_0006表
    mysql> source /tmp/tb_0006.sql;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select * from tb_0006;
    ±—±-------------------------------±----------------------±----------------+
    | id | title | author | submission_date |
    ±—±-------------------------------±----------------------±----------------+
    | 1 | 网络工程师的python之路 | 王印 | 2021-07-01 |
    | 2 | TCP/IP路由技术 | 葛建伟,吴剑章 | 2002-06-30 |
    ±—±-------------------------------±----------------------±----------------+
    2 rows in set (0.00 sec)

    6、修改从库my.cnf配置文件

    #编辑从库my.cnf配置文件,主库因为是针对整库的配置,不需要做任何修改。
    [wuhs@s153 ~]$ vim my.cnf
    #在配置文件中加入如下行
    replicate-do-table=testdb.tb_0006
    #重启从库
    [wuhs@s153 ~]$ sh startmysql.sh

    7、清空从库配置

    #清空从库配置,如果是有多个从库配置则需要指定
    mysql> reset slave all;
    Query OK, 0 rows affected (0.00 sec)

    8、查看备份的binlog日志位置

    [root@s153 ~]# cat /tmp/tb_0006.sql |grep MASTER_LOG_POS
    – CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000002’, MASTER_LOG_POS=1911;

    9、重新配置主从

    mysql> change master to
    -> MASTER_HOST=‘192.168.0.152’,
    -> MASTER_USER=‘bak’,
    -> MASTER_PASSWORD=‘Bak!1234’,
    -> MASTER_PORT=3306,
    -> MASTER_LOG_FILE=‘mysql-bin.000002’, MASTER_LOG_POS=1911;
    Query OK, 0 rows affected, 1 warning (0.43 sec)

    10、在主库上插入数据

    mysql> insert into tb_0006 (id,title,author,submission_date) values (4,“TCP/IP路由技术·卷三”,“葛建伟,吴剑章”,“2002-06-30”);
    Query OK, 1 row affected (0.13 sec)
    mysql> insert into tb_0002 (id,title,author,submission_date) values (2,“TCP/IP路由技术”,“葛建伟,吴剑章”,“2002-06-30”);

    11、启动主从

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

    11、查看主从状态

    mysql> show slave status\G在这里插入图片描述

    12、检查数据

    在这里插入图片描述

    四、数据库表更新时间检查

      在完成数据库备份后,如果我们需要确定哪些数据表发送了更新操作,我们可以通过查看information_schema库tables中各表的更新时间,与备份文件时间进行对比就知道在备份完成后是否有更新。

    1、查看数据库备份时间

    在这里插入图片描述

    2、查询数据库表的最新更新时间

    mysql> use information_schema;
    mysql> select TABLE_SCHEMA,TABLE_NAME,UPDATE_TIME from TABLES where TABLE_SCHEMA=‘testdb’;
    #testdb切换为你需要查询的数据库即可。
    在这里插入图片描述

  • 相关阅读:
    小程序端自定义导航栏-样式适配-安全距离
    结合DevOps实践:使用Huawei CodeArts和CCE进行自动化Kubernetes集群部署
    基于stm32的恒功率无线充电
    最全面的蓝桥杯常考知识点总结(Python)|冲国赛
    LeetCode 45. Jump Game II(DP)
    LeetCode 算法:盛最多水的容器c++
    让你随时随地访问金蝶云星空企业版v8.0,内网穿透轻松实现远程办公!
    机器学习之旅-从Python 开始
    电力能源指挥中心调度台解决方案主要关注的问题
    6. vector
  • 原文地址:https://blog.csdn.net/carefree2005/article/details/125805876