参考文章:https://www.jianshu.com/p/b0cf461451fb
需求:为了无缝上线小程序,需要两个同构的数据库来做支撑(一个线上,一个预备上线)。
问题:两个数据库在同一台服务器的mysql服务下。
解决问题的方案:
1.在同一台服务器下安装两个mysql服务(从服务器版本可以比主服务器版本高),进行主从/主主配置(这种方式不建议,以免服务器宕机)
2.将同构数据库分别部署在两台服务器上。(这种实现方式比较主流,还能防备宕机)。
着手实现:
服务器(将单机拆成多机):
master:xxx.xxx.xxx.1 mysql版本:5.6.43
slave: xxx.xxx.xxx.2 mysql版本:5.6.43
配置步骤:
看到网上大多都是先锁库,备份,解锁库,在进行配置主从(疑问:如果解锁后数据变动怎么办?)。
所以我个人理解应该先配置master的my.cnf,在进行先锁库,备份,解锁库,在进行配置slave。
1.先配置master服务器的/etc/my.cnf
server_id = 1
binlog-do-db = db (主从复制需要的数据库)
#binlog-ignore-db=db(主从复制需要忽略的数据库,和上面二选一进行配置)
#log-slave-updates=true (双主需要开启,同步slave中binlog日志)
#sync_binlog = 0
#sync-master-info=1
#auto_increment_offset = 1
#auto_increment_increment = 2
#expire_logs_days = 7
#log_bin_trust_function_creators = 1
配置完成重启数据库服务,让配置生效
2.拷贝master服务器上的数据库备份到slave上
mysql>use db;
mysql>flush tables with read lock; // 锁库,防止这段时间有写入。
[root@master~]# mysqldump -uroot -pxxxx db > /root/db.sql;
// 只是导出数据结构+数据 如果需要导出函数和存储过程自行查看
mysql>show master status; // 查看主库binlog的pos位置。
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 4 | db | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql>unlock tables; // 解锁数据库
3.创建replication用户,使slave通过I/O线程以该用户名连接到master,并读取binlog二进制日志。
mysql>grant replication slave on *.* to 'replicate'@'%' identified by 'replicate';
myqsl>flush privileges;(刷新缓存,使用户生效)
mysql>show processlist \G;(查看是否已有生效的master的I/O线程)
//state=Master has sent all binlog to slave; waiting for binlog to be updated;user=replicate
4.将db.sql文件发送到slave服务器,然后进行数据导入
[root@slave ~]scp root@xxx.xxx.xxx.1:/root/db.sql /root/db.sql(同一网络下使用scp拷贝)
mysql>create datebase db;
mysql>source /root/db.sql;(拷贝成功)
5.配置slave服务器中的/etc/my.cnf
server_id=2
replicate-do-db=db(需要同步主库的从库名称)
#replicate-ignore-db=xxx(忽略不需要进行主从的数据库)
同样重启slave服务器的mysql服务,让配置生效。
6.此时slave应该要知道如何连接到master,并重访其二进制日志。
不需要去修改数据库配置了,而是需要在mysql服务里面执行下面语句就能连接到master服务,获取到二进制日志
mysql>CHANGE MASTER TO
mysql>MASTER_HOST='xxx.xxx.xxx.1',
mysql>MASTER_USER='replicate',
mysql>MASTER_PASSWORD='replicate',
mysql>MASTER_LOG_FILE='mysql-bin.000001',
mysql>MASTER_LOG_POS=4;
mysql>show slave status \G;(查看slave的运行状态,此时应该是尚未运行)
// slave_io_state为空slave_io_running、slave_sql_running为no
mysql>start slave;(开启slave服务)
// slave_io_state =Waiting for master to send event
// slave_io_running = yes
// slave_sql_running = yes
当我们看到slave_io_running和slave_sql_running为双yes的时候,我们配置已经完成,接下来我们可以开始进行测试了。
7.查看二进制日志文件,由于二进制日志格式比较特殊,我们不能用tail指令去查看日志。
[root@slave ~]# mysqlbinlog mysql-bin.000001 | tail -500
8.重点:确定你分配的mysql用户的权限问题,当权限不可达的时候同步数据会失败。
我遇到一个问题,至今还没考虑清楚。如果有大佬遇到过想明白了,还想不吝赐教:
使用root@%用户的时候,用来测试主从同步数据不成功(主库用binlog日志,从库有relay-bin日志;master的I/O线程正常,slave的I/O线程和sql线程都正常,卡了好久)。
后来使用root@localhost用户登录数据库才测试成功的。现在莫名其妙的root@%用户一切正常了。期间没做任何改动,不知道原因。看服务器history,也没有看到其他人修改过其他地方,满脸的懵逼。
写得不好,还在初级阶段,还望大家多多指教。