本文概览:
备份原数据库并记录相关事务点
在原数据库中建立复制用户
在新实例上恢复备份数据库
在新实例上配置复制链路
在新实例上启动复制
mysql>mysqldump --master-data=2 --single-transaction --routines --triggers --events -uroot -p imooc_db > bak_imooc.sql
master-data记录日志点
single-transaction指定备份是在一个事务中完成
routines备份存储过程
triggers备份触发器
events备份事件
输入密码后有可能显示如下异常:
mysqldump: Error: Binlogging on server not active
则需要开启日志功能:
/etc/my.conf中新增:
必须放在mysqld的下面
log-bin=mysql
server-id=1
再次执行则可成功。
新建数据库
order_db:># mysql -u root -p -e"create database order_db"
导入备份文件到数据库中
>#mysql -uroot -p order_db < bak_imooc.sql
mysql> create user 'im_repl'@'172.22.%.%' identified by '123456';
可能会由于安全策略出现创建失败的情况,只需要修改一下安全策略:两种常用方法:
mysql> grant replication slave on *.* to 'im_repl'@'172.22.%.%';
== 在mysql中如果有不熟悉的命令可以通过\h 命令关键字,进行查看。==
mysql>change master to master_host=’172.22.34.28’, master_user=’im_repl’,master_password=’123456’, MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=154
参数说明:
master_host是同步的主机地址
master_user是同步的用户
master_password是同步的密码
master_log_file是同步的文件名
MASTER_LOG_POS是同步的位置
以上两个值都是从备份文件中直接复制的:
经过以上配置是否就可以直接启动了呢?
我们在主服务器中用的数据库名称是“master_db”,但是从服务器中的数据库名是“order_db”、“product_db”、“customer_db”,这样一来从库和主库的数据库名不一样,直接启动会报错的。
所以,需要建立过滤链接:
Mysql> change replication filter replicate_rewrite_db=((master_db, order_db));
查看状态:
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 172.22.34.28
Master_User: im_repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 154
Relay_Log_File: localhost-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: No
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 154
Relay_Log_Space: 154
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 0
Master_UUID:
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State:
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB: (master_db,order_db)
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
Replicate_Rewrite_DB: (master_db,order_db)
mysql>start slave;
如果一切正常,则show slave status;后:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
但是,有时候会出现以下情况:
Slave_IO_Running: No
Slave_SQL_Running: Yes
此时,就要查看从节点的日志了(/var/log/mysqld.log),我遇到的问题如下:
Slave I/O for channel '': Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it). Error_code: 1593
通过分析可知,是由于server-id冲突造成的,而且mysql 5.6的复制引入了uuid的概念,各个复制结构中的server_uuid也得保证不一样才行:
首先修改server-id:
vi /etc/my.cnf
[mysqld]
server-id=1
然后修改server_uuid:
// 查看
show variables like '%server_uuid%';
Master:
mysql> show variables like '%server_uuid%';
+---------------+--------------------------------------+
| Variable_name | Value |
+---------------+--------------------------------------+
| server_uuid | 46d587a7-3660-11e9-8173-080027b427af |
+---------------+--------------------------------------+
1 row in set (0.01 sec)
Slave:
mysql> show variables like '%server_uuid%'
-> ;
+---------------+--------------------------------------+
| Variable_name | Value |
+---------------+--------------------------------------+
| server_uuid | 46d587a7-3660-11e9-8173-080027b427af |
+---------------+--------------------------------------+
1 row in set (0.02 sec)
Master和Slave中的server_uuid是一样的,这就是出错的原因。那么这个问题是如何产生的呢?
原来我是用虚拟机来模拟的环境,在配置好master后,我直接复制了master的虚拟机修改了一下虚拟机名后当作了slave。
问题解决:
找到data文件夹下的auto.cnf文件,修改里面的uuid值,保证各个db的uuid不一样,重启db即可。
// 查看auto.cnf文件的位置:
>vi /etc/my.cnf
[mysqld]
#
...
log_bin=mysql-bin
server-id=1
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
validate_password=off
// 找到data的目录
datadir=/var/lib/mysql
vi auto.cnf // 修改id即可
修改完后,需要重启:
service mysqld restart