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机器重起后,事务回滚造成的.

排错:

问题1IO_Running NO

1.用户授权错误  密码    2.防火墙未关闭   3.二进制日志未开启     pos      

问题2SQL_Running NO

一般是回放数据不一致造成的

注意查看报错信息:

Errnor:错误信息

Timestamp:时间戳

    

Last_SQL_Error_Timestamp: 201121 16:53:03    201121

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

 

 

主从数据不一致

方式一:手动同步   手动同步需要停止master的写操作!

  1. 主服务器上查看主机状态:

mysql> show master status

 

记录FilePosition对应的值

  1. 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: 日志号

方式二、一般是事务回滚造成的:

解决办法:

mysql> stop slave ;

mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

mysql> start slave ;

再次查看 show slave status\G  正常显示;;;  。进入主库查看 show master status

 

 

posted @ 2021-11-12 10:39  随身笔记~  阅读(497)  评论(0编辑  收藏  举报