Mysql主从复制 及 主从复制报错
原文参考链接
https://my.oschina.net/u/2925037/blog/3192918
https://blog.csdn.net/lilygg/article/details/87889765
升级大致步骤如下:
1、修改主数据库配置文件,开启主从复制必要的功能。
2、在主数据库中创建一个账号并授权给从数据库使用。
3、导出主数据库中的数据。
4、修改从数据库配置文件,开启主从复制必要的功能。
5、把主数据库中导出的数据导入到从数据库。
6、在从数据库中配置连接主数据库要用到的账户、密码等。
7、启动主从复制功能,并检查是否正常复制。
登陆主库配置数据同步账号( grant授权账号)
创建账号:create user '用户名'@'192.168.100.%' identified by '密码';
授权: 允许从机以 该账号[用户名、密码] 登录主机
:grant [replication slave复制权限 | all privileges 所有权限] on database.table to '用户名1'@'从机的
ip' identified by '密码1' ; [WITH GRANT OPTION]
WITH GRANT OPTION 表示 给用户授予grant权限
刷新权限 : flush privileges;
再进入mysql执行 select user,host from mysql.user; 看看从库使用的账号是否创建成功
从库
stop slave;
change master to master_host='主库ip地址',master_user='用户名1',master_password='密码1',master_log_file='mysql-bin.000001',master_log_pos=726;
注释: master_host: 复制主机 ; master_user: 复制用户 ; master_password: 用户密码
master_log_file: 二进制日志名称 ; master_log_pos: 日志号
开启从库线程: start slave; 重新复制,必须先执行:stop slave 再重新执行
SHOW SLAVE STATUS\G; 查看到主库的ip,port以及是否连接成功的信息
=========================================================================================
# mysql 主服务器
vi /etc/my.cnf
[mysqld]
server-id=1 主服务器唯一ID (必须)
log-bin=自己本地的路径/data/mysql-bin 启用二进制日志 (必须)
log-err=自己本地的路径/data/mysqlerr 启用错误日志(可选)
binlog_format=mixed
binlog_do_db=patent_newt # 要同步的数据库
binlog_do_db=patent_portal # 要同步的数据库
binlog-ignore-db=mysql # 表示不同步mysql库
binlog-ignore-db=information_schema # 表示不同步information_schema库
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
重启 mysql
service mysql restart
进入mysql 终端
create user 'slave'@'ip' identified by 'pwd'; # 5.7要求密码必须含有大小写英文,符号和数字
grant FILe on *.* to 'slave'@'ip' identified by 'pwd'; #赋予FILE权限,允许从从库ip访问主库
GRANT replication slave ON *.* TO 'slave'@'ip' IDENTIFIED BY 'pwd';
FLUSH PRIVILEGES;
查询mysql状态 ---> 查看 File(日志文件) 和 Position(位置)
show master status
# mysql 从服务器
vi /etc/my.cnf
[mysqld]
server-id=2
log-bin=mysql-bin
replicate_do_db=patent_newt # 要同步的数据库
replicate_do_db=patent_portal # 要同步的数据库
replicate-ignore-db=mysql # 表示不同步mysql库
replicate-ignore-db=information_schema # 表示不同步information_schema库
replicate-ignore-db=performance_schema
replicate-ignore-db=sys
(slave-skip-errors=all
slave-net-timeout=60)
重启 mysql
service mysql restart
进入mysql 终端
1. stop slave;
2. change master to master_host='ip',master_user='slave',master_password='pwd',master_log_file='mysql-bin.000001', master_log_pos=1140; 连接主数据库语句
3. start slave;
4. SHOW SLAVE STATUS\G; 查看到主库的ip,port以及是否连接成功的信息
Slave_IO_Running 和 Slave_SQL_Running 都为Yes的时候表示配置成功
主从报错:
(一)"Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work."
这个错误提示。即主从架构中使用了相同的UUID。检查server_id系统变量,已经是不同的设置,那原因是?接下来为具体描述。
master_mysql> show variables like 'server_id';
slave_mysql> show variables like 'server_id';
查看是不同的。
但是查看/mysql/data/auto.cnf发现里面的UUID 是 相同的。原因是mysql是直接从节点1上拷贝过来而导致。
解决:mv /mysql/data/auto.cnf /mysql/data/auto.cnf.bak 重启mysql解决
(二)Slave_SQL_Running: No
1.程序可能在slave上进行了写操作
2.也可能是slave机器重起后,事务回滚造成的.
排错:
问题1:IO_Running NO
1.用户授权错误 密码 2.防火墙未关闭 3.二进制日志未开启 pos
问题2:SQL_Running NO
一般是回放数据不一致造成的
注意查看报错信息:
Errnor:错误信息
Timestamp:时间戳
Last_SQL_Error_Timestamp: 201121 16:53:03 20年11月21日
Last_SQL_Error: Error 'This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)' on query. Default database: 'patent_newt'.
Query: 'CREATE DEFINER=`root`@`%` FUNCTION `getChildList`(rootId INT) RETURNS varchar(3000) CHARSET latin1
原因:执行创建函数的sql语句时的报错信息
我们创建函数时必须指定我们的函数是否是
1. DETERMINISTIC 不确定的
2. NO SQL 没有SQl语句,当然也不会修改数据
3. READS SQL DATA 只是读取数据,当然也不会修改数据
4. MODIFIES SQL DATA 要修改数据
5. CONTAINS SQL 包含了SQL语句
1. 在mysql数据库中执行以下语句 (临时生效,重启后失效)
set global log_bin_trust_function_creators=TRUE;
2. 在配置文件/etc/my.cnf的[mysqld]配置log_bin_trust_function_creators=1
主从数据不一致
l 方式一:手动同步 手动同步需要停止master的写操作!
- 主服务器上查看主机状态:
mysql> show master status
记录File和Position对应的值
- 到slave服务器上执行手动同步:
mysql> stop slave; 需要先关闭线程 重新复制,必须先执行:stop slave 再重新执行
mysql> change master to master_host='master_host',master_user='master_user',master_password='master_password',master_log_file='mysql-bin.000001',master_log_pos=726;
mysql> start slave;
注释: master_host: 复制主机 ; master_user: 复制用户 ; master_password: 用户密码
master_log_file: 二进制日志名称 ; master_log_pos: 日志号
l 方式二、一般是事务回滚造成的:
解决办法:
mysql> stop slave ;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> start slave ;
再次查看 show slave status\G 正常显示;;; 。进入主库查看 show master status