mysql 数据库主从同步配置(同库名&不同库名)

最近工作中遇到需要同步数据库的需求,结合着一些人的经验整理了下mysql 主从同步的配置步骤,同库名的情况比较常见也容易解决,不同库名的情况是这次遇到的一个问题点,做下记录。

1)环境描述

mysql 的安装可以参考:http://www.cnblogs.com/kevingrace/p/6109679.html

Centos 7 版本

master: 172.20.223.130

slave: 172.20.223.128
注意下面几点:

1)要保证同步服务期间之间的网络联通。即能相互ping通,能使用对方授权信息连接到对方数据库(防火墙开放3306端口)。

2)同步前,双方数据库中需要同步的数据要保持一致。这样,同步环境实现后,再次更新的数据就会如期同步了。

2)主从复制实现过程记录

为了测试效果,先在master机器上创建测试库

mysql> CREATE DATABASE zxkang_sync CHARACTER SET utf8 COLLATE utf8_general_ci;
Query OK, 1 row affected (0.00 sec)

mysql> use zxkang_sync;
Database changed
mysql> create table if not exists haha (id int(10) PRIMARY KEY AUTO_INCREMENT,name varchar(50) NOT NULL);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into zxkang_sync.haha values(1,"terry"),(2,"tony");
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from zxkang_sync.haha;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | terry |
|  2 | tony |
+----+-----------+
2 rows in set (0.00 sec)

温馨提示:

修改库或表的字符集
mysql> alter database zxkang_sync default character set utf8;    //修改zxkang_sync库的字符集
mysql> alter table zxkang_sync.haha default character set utf8;  //修改zxkang_sync.haha表的字符集

添加主键
mysql> Alter table zxkang_sync.haha add primary key(id);     //将zxkang_sync.haha表的id添加主键
mysql> Alter table zxkang_sync.haha change id id int(10) not null auto_increment;  //自增长属性

删除主键时要先删除自增长,再删除主键
mysql> Alter table zxkang_sync.haha change id id int(10);    //删除自增长
mysql> Alter table zxkang_sync.haha drop primary key;     //删除主建

下面是master数据库上的操作:

1)设置master数据库的my.cnf文件(在[mysqld]配置区域添加下面内容)

[root@master ~]# vim /etc/my.cnf
.......
server-id=1        #数据库唯一ID,主从的标识号绝对不能重复。
log-bin=mysql-bin    #开启bin-log,并指定文件目录和文件名前缀
binlog-do-db=zxkang_sync  #需要同步的数据库。如果是多个同步库,就以此格式另写几行即可。如果不指明对某个具体库同步,就去掉此行,表示同步所有库(除了ignore忽略的库)。
binlog-ignore-db=mysql  #不同步mysql系统数据库。如果是多个不同步库,就以此格式另写几行;也可以在一行,中间逗号隔开。
sync_binlog = 1      #确保binlog日志写入后与硬盘同步
binlog_checksum = none  #跳过现有的采用checksum的事件,mysql5.6.5以后的版本中binlog_checksum=crc32,而低版本都是binlog_checksum=none
binlog_format = mixed   #bin-log日志文件格式,设置为MIXED可以防止主键重复。

温馨提示:

在主服务器上最重要的二进制日志设置是sync_binlog,这使得mysql在每次提交事务的时候把二进制日志的内容同步到磁盘上,即使服务器崩溃也会把事件写入日志中。

sync_binlog这个参数是对于MySQL系统来说是至关重要的,他不仅影响到Binlog对MySQL所带来的性能损耗,而且还影响到MySQL中数据的完整性。对于"sync_binlog"参数的各种设置的说明如下:
sync_binlog=0,当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。
sync_binlog=n,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。

在MySQL中系统默认的设置是sync_binlog=0,也就是不做任何强制性的磁盘刷新指令,这时候的性能是最好的,但是风险也是最大的。因为一旦系统Crash,在binlog_cache中的所有binlog信息都会被丢失。而当设置为“1”的时候,是最安全但是性能损耗最大的设置。因为当设置为1的时候,即使系统Crash,也最多丢失binlog_cache中未完成的一个事务,对实际数据没有任何实质性影响。

从以往经验和相关测试来看,对于高并发事务的系统来说,“sync_binlog”设置为0和设置为1的系统写入性能差距可能高达5倍甚至更多。


2)导出master数据库多于slave数据库中的数据,然后导入到slave数据库中。保证双方在同步环境实现前的数据一致。

导出数据库之前先锁定数据库
mysql> flush tables with read lock;    #数据库只读锁定命令,防止导出数据库的时候有数据写入。unlock tables命令解除锁定
导出master数据库中多余的 zxkang_sync 库
[root@master ~]# mysqldump -uroot zxkang_sync -p > /home/vivoadmin/zxkang_sync.sql
[root@master ~]# rsync  -e "ssh -p22" -avpgolr /home/vivoadmin/zxkang_sync.sql 172.20.223.128:/home/vivoadmin   #将导出的sql文件上传到slave机器上,此处如果无效,可以用scp发送到slave上,在用 mysql 的导入命令导入库,一次性工作而已,不要怕麻烦

3)设置数据同步权限

mysql> grant replication slave,replication client on *.* to slave@'172.20.223.128' identified by "slave@123";
Query OK, 0 rows affected (0.02 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

温馨提示:

权限查看方式
mysql> show grants;
mysql> show grants for slave@'172.20.223.128';

4)查看主服务器master状态(注意File与Position项,从服务器需要这两项参数)

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      120 | zxkang_sync      | mysql            |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

下面是slave数据库上的操作:

1)设置slave数据库的my.cnf配置文件

[root@master ~]# vim /etc/my.cnf

server-id=2   #设置从服务器id,必须于主服务器不同
log-bin=mysql-bin   #启动MySQ二进制日志系统

#如果需要同步的数据库名相同
replicate-do-db=zxkang_sync  #需要同步的数据库名。如果不指明同步哪些库,就去掉这行,表示所有库的同步(除了ignore忽略的库)。

#如果需要同步的数据库名不同
replicate-rewrite-db=zxkang_sync->test  # master 上的数据库名为 zxkang_sync , slave 上的库名为 test

replicate-ignore-db=mysql  #不同步mysql系统数据库
slave-skip-errors = all   #跳过所有的错误错误,继续执行复制操作

温馨提示:
当只针对某些库的某张表进行同步时,如下,只同步 zxkang_sync 库的 haha 表:

replicate-do-db = zxkang_sync
replicate-wild-do-table = zxkang_sync.haha       //当只同步几个或少数表时,可以这样设置。注意这要跟上面的库指定配合使用;

2)在slave数据库中导入从master传过来的数据。

mysql> CREATE DATABASE zxkang_sync CHARACTER SET utf8 COLLATE utf8_general_ci;   #先创建一个huanqiu空库,否则下面导入数据时会报错说此库不存在。
mysql> use zxkang_sync;
mysql> source /home/vivoadmin/zxkang_sync.sql;   #导入master中多余的数据。
.......

3)配置主从同步指令

mysql> stop slave;   #执行同步前,要先关闭slave
mysql> change  master to master_host='172.20.223.130',master_user='slave',master_password='slave@123',master_log_file='mysql-bin.000001',master_log_pos=120;

mysql> start slave;
mysql> show slave status \G;
.......
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.20.223.130
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 120
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 279
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: huanqiu
          Replicate_Ignore_DB: mysql
           .............
        Seconds_Behind_Master: 0

如上,当IO和SQL线程的状态均为Yes,则表示主从已实现同步了!

查看slave数据库中的数据情况

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| zxkang_sync            |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> select * from huanqiu.haha;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | terry |
|  2 | tony |
+----+-----------+
2 rows in set (0.00 sec)
下面测试下Mysql主从同步的效果

现在主数据库上写入新数据

mysql> unlock tables;    #解锁,否则新数据无法写入
mysql> insert into zxkang_sync.haha values(100,"anhui");
Query OK, 1 row affected (0.00 sec)

然后在slave数据库上查看,发现master上新写入的数据已经同步过来了

mysql> select * from zxkang_sync.haha;
+-----+-----------+
| id  | name      |
+-----+-----------+
|   1 | terry |
|   2 | tony |
| 100 | anhui     |
+-----+-----------+
3 rows in set (0.00 sec)

至此,主从同步环境已经实现!

重要提示:修改mysql配置文件,别忘了重启数据库使修改的配置生效


注意:
Mysql主从环境部署一段时间后,发现主从不同步时,如何进行数据同步至一致?
有以下两种做法:

1)参考:mysql主从同步(2)-问题梳理 中的第(4)步的第二种方法

2)参考:mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容