ITPub博客

首页 > 数据库 > 数据库开发技术 > MySQL不同实例间表的同步实现

MySQL不同实例间表的同步实现

原创 数据库开发技术 作者:DBA修行之路 时间:2021-06-01 18:05:17 0 删除 编辑
今天被问到一个问题,"MySQL是否可以实现不同实例间表的同步?",就花了一些时间实践了下,以下为测试过程。
首先,在两台服务器上分别建立一个MySQL实例,这里版本使用的是MySQL5.7.33,同步采用的是传统的bin+pos方式,未开启GTID。
mysql安装大致步骤如下:
  1. 上传安装包,解压,并配置环境变量,命令如下:
    vi .bash_profile

    export MYSQL_HOME=/mysql/mysql-5.7.33

    export PATH=$MYSQL_HOME/bin:$PATH

    使配置生效:

    source .bash_profile

  2. 初始化实例,命令如下:

    mysqld --initialize-insecure --user=mysql --basedir=/mysql/mysql-5.7.33 --datadir=/masterdata/3316

  3. 启动实例,命令如下:

    nohup mysqld_safe --defaults-file=/mysql/mysql-5.7.33/etc/my3316.cnf --user=mysql &

  4. 修改root用户密码并创建mysql管理员用户,命令如下:

    mysql -uroot -p --socket=/masterdata/3316/mysql.sock

    alter user root@localhost identified by 'xxx';

    GRANT ALL PRIVILEGES ON *.* TO mysql@"%" IDENTIFIED BY 'xxx' WITH GRANT OPTION;

    flush privileges;

  5. 使用mysql用户登录,命令如下:

    mysql -h152.55.229.225 -umysql -p'xxx' -P3316


接下来开始测试,测试步骤如下:
  1. 在152.55.229.225:3316上建立同步用户并查看当前日志点,命令如下。

    GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl@'%' IDENTIFIED BY 'xxx';

    stop slave;

    reset slave;

    show master logs;


2.在152.55.229.225:3316上建立student库,并在student中建立两张表student_info,student_score,插入若干条数据作为测试,命令如下:
create database student;
use student;

       CREATE TABLE `student_info` (

       `id` int(11) NOT NULL,

        `name` varchar(10) DEFAULT NULL,

        PRIMARY KEY (`id`),

        KEY `idx_name` (`name`)

        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

        

       CREATE TABLE `student_score` (

       `id` int(11) NOT NULL,

       `name` varchar(10) DEFAULT NULL,

       `score` int(11) DEFAULT NULL,

       PRIMARY KEY (`id`),

       KEY `idx_name` (`name`)

       ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    

    insert into student_info values (1,'zhangsan'),(2,'lisi'),(3,'wangwu'),(4,'zhaoliu');

  insert into student_score values (1,'zhangsan',60),(2,'lisi',70),(3,'wangwu',80),(4,'zhaoliu',90);



3.在152.55.229.226:3316上建立单向同步:
stop slave;
change master to master_host='152.55.229.225', 
master_port=3316,
master_user='repl',master_password='xxx',
master_log_file='mysql_bin.000001',
master_log_pos=1145;

change replication filter replicate_wild_do_table = ('student.student_score');

start slave;
show slave status\G
注,第一次由于152.55.229.225:3316上没有student库复制报错,手动建立后解决问题。


4.执行show slave status\G命令查看主从状态:


5.验证是否同步,通过查看表,可以发现已经同步student_score表。

6.再次验证,在152.55.229.225:3316上向student_info,student_score 表中都插入数据,观察是否会只同步student_score 表,命令如下:
insert into student_info values (5,'goudan'),(6,'xiaobai'),(7,'wangba'),(8,'wugui');
insert into student_score values (5,'goudan',20),(6,'xiaobai',40),(7,'wangba',80),(8,'wugui',90);

可以观察在152.55.229.226:3316上只同步了tudent_score 表,说明验证成功。

以上就是MySQL不同实例间表的同步实现了,除此之外,还可以设置同步多张表,单个库,多个库,实现方法类似。
tip:
实现多张表同步:
change replication filter replicate_wild_do_table = ('db1.t1','db2.t2');
实现单库同步:
change replication filter replicate_do_db = (db1);
实现多库同步:
change replication filter replicate_do_db = (db1, db2);
实现所有同步:
change replication filter replicate_do_db = ();
忽略单表同步:
change replication filter replicate_wild_ignore_table =  ('db1.t1');
注:同步配置在线修改后如果未写入到配置文件中,重启后会丢失,需要重新配置,另外,同步的库名需要一致。

原文作者:DBA修行之路;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-05-25

  • 博文量
    64
  • 访问量
    23946