前提:一主一从服务器已经搭建完毕
mysql 主从服务器搭建与配置
主-master:192.168.1.77
从-salve:192.168.1.76
需要使用到的账号:
用户: admin 密码: [email protected] (数据库管理员账号)
用户: javauser 密码: 123456@mysql (程序数据库账号)
用户: administrator 密码: mysql2019.com(增删改查账号)
用户: test 密码: 123456(查寻账号)
用户:sync_user 密码:sync_user@123.#* (主从复制账号)
# vi /etc/my.cnf
max_connections = 5000 ##修改/etc/my.cnf 的最大连接数
server-id = 77 ##该ID为mysql服务唯一标识,主从服务器的该ID值不能相同!
重启mysql
# systemctl restart mysql
登陆数据库
# mysql -u root -p
创建admin数据库管理员账号,并赋予全部权限
mysql> create user 'admin'@'192.168.%.%';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'admin'@'192.168.%.%' IDENTIFIED BY '[email protected]' WITH GRANT OPTION;
创建javauser程序数据库账号,并赋予增删改查权限
mysql> create user 'javauser'@'192.168.%.%';
mysql> GRANT Select,Update,insert,delete ON *.* TO 'javauser'@'192.168.%.%' IDENTIFIED BY '123456@mysql';
创建administrator增删改查账号,并赋予增删改查权限
mysql> create user 'administrator'@'192.168.%.%';
mysql> GRANT Select,Update,insert,delete ON *.* TO 'administrator'@'192.168.%.%' IDENTIFIED BY 'mysql2019.com';
创建test查询账号,并赋予查询权限
mysql> create user 'test'@'192.168.%.%';
mysql> GRANT Select ON *.* TO 'test'@'192.168.%.%' IDENTIFIED BY '123456';
创建sync_user主从复制账号
mysql> create user 'sync_user'@'192.168.%.%';
mysql> grant syncication slave on *.* to 'sync_user'@'192.168.%.%' identified by 'sync_user@123.#*';
刷新权限关系表
mysql> flush privileges;
查看master状态:
mysql> show master status\G;
# vi /etc/my.cnf
max_connections = 5000 ##修改/etc/my.cnf 的最大连接数
server-id = 78 ##该ID为mysql服务唯一标识,主从服务器的该ID值不能相同!
重启mysql
# systemctl restart mysql
登陆mysql
# mysql -u root -p
#执行同步命令,设置主服务器ip,同步账号密码,同步位置
mysql> change master to master_host = '192.168.1.77',master_port = 3306,master_user = 'sync_user',master_password = 'sync_user@123.#*';
#开启同步功能
mysql> start slave;
查看从服务器状态
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.77
Master_User: sync_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: bin.000001
Read_Master_Log_Pos: 2889
Relay_Log_File: relay.000003
Relay_Log_Pos: 3090
Relay_Master_Log_File: bin.000001
Slave_IO_Running: Yes ######必须是两个YES,如果有任何一个为NO,则有问题
Slave_SQL_Running: Yes ######
这两项为YES,则说明主从配置成功!
其他报错及排查过程:
mysql> start slave;
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
解释:relay log 文件:由IO thread线程从主库读取的二进制日志事件组成,该日志被Slave上的SQL thread线程执行,从而实现数据的复制。由于mysql.slave_relay_log_info表中保留了以前的复制信息,导致新从库启动时无法找到对应文件。
解决:
mysql> reset slave;
mysql> change master to master_host = '192.168.1.77',master_port = 3306,master_user = 'sync_user',master_password = 'sync_user@123.#*';
mysql> start slave;
mysql> show slave status\G;
Error 'Operation CREATE USER failed for 'javauser'@'192.168.%.%'' on query. Default database: ''. Query: 'CREATE USER 'javauser'@'192.168.%.%' IDENTIFIED WITH 'mysql_native_password''
解释,因为从服务器上提前新建好了用户,它需要去同步主服务器的用户,所有报错,在做主从的时候,只需要主服务器创建用户就可以了,从服务器无需创建用户操作,会自动同步的
解决:
mysql> drop user 'javauser'@'192.168.%.%';
mysql> flush privileges;
mysql> stop slave;
mysql> reset slave;
mysql> start slave;
mysql> show slave status\G;
[ERROR] 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 syncication to work (or the --syncicate-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
分析:报错已经给出了:“syncicate-same-server-id”,说明是配置文件中主从的server-id 一致了。
解决:
修改主从的/etc/my.cnf 配置项server-id 使其不一致,再重启mysql。