mysql主节点1593从节点正常_Mysql5.7主从复制(常遇问题解决)

本文概览:

备份原数据库并记录相关事务点

在原数据库中建立复制用户

在新实例上恢复备份数据库

在新实例上配置复制链路

在新实例上启动复制

一、备份Master上的数据库

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';

可能会由于安全策略出现创建失败的情况,只需要修改一下安全策略:两种常用方法:

在/etc/my.cnf配置文件中增加validate_password=off([mysqld]的下面);

set global validate_password_policy=0;(修改密码策略为LOW),set global validate_password_length=0;(修改密码长度);

四、授予主从复制账号权限

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是同步的位置

以上两个值都是从备份文件中直接复制的:

a343e49db2106387895e2d84e0a4a7f0.png

经过以上配置是否就可以直接启动了呢?

我们在主服务器中用的数据库名称是“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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值