主主同步事实上就是在主从的基础上,将原先的从机当主机,主机当从机再配置一遍主从同步,两台mysql都可读写,互为主备。
Mysql服务器之间的主从同步或主主同步是基于二进制日志机制,主服务器使用二进制日志来记录数据库的变动情况,从服务器通过读取和执行该日志文件来保持和主服务器的数据一致。
在使用二进制日志时,主服务器的所有操作都会被记录下来,然后从服务器会接收到该日志的一个副本。从服务器可以指定执行该日志中的哪一类事件(譬如只插入数据或者只更新数据),默认会执行日志中的所有语句。
每一个从服务器会记录关于二进制日志的信息:文件名和已经处理过的语句,这样意味着不同的从服务器可以分别执行同一个二进制日志的不同部分,并且从服务器可以随时连接或者中断和服务器的连接。
主服务器和每一个从服务器都必须配置一个唯一的ID号(在my.cnf文件的[mysqld]模块下有一个server-id配置项),另外,每一个从服务器还需要通过CHANGE MASTER TO语句来配置它要连接的主服务器的ip地址,日志文件名称和该日志里面的位置(这些信息存储在主服务器的数据库里)
mysql5.7版本主主同步部署
root 下
useradd mysql # 加用户echo 'root123'|passwd --stdin mysql # 设置密码tar -zxf mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz -C /usr/local/# 解压mv mysql-5.6.34-linux-glibc2.5-x86_64 mysql # 重命名
cd/usr/local/mysql
#mysql5.7没有data目录,手动创建mkdirdatachown -R mysql:mysql mysql/ # 赋予权限
初始化
# 切换用户su -mysql
cd/usr/local/mysql
# 初始化
# mysql5.7和之前版本不同,很多资料上都是这个命令:../scripts/mysql_install_db --user=mysql,而mysql5.7的mysql_install_db命令是在bin目录下 的并且建议 用 mysqld --initialize命令
bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
#在低于5.7版本可以用下面这个命令
# cd /usr/local/mysql/scripts/
# ./mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
如下:
bash-4.1$ bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data2020-09-24T17:18:06.303755Z 0 [Warning] Changed limits: max_open_files: 1024 (requested 5000)2020-09-24T17:18:06.303877Z 0 [Warning] Changed limits: table_open_cache: 431 (requested 2000)2020-09-24T17:18:06.304157Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for moredetails).2020-09-24T17:18:07.357897Z 0 [Warning] InnoDB: New log files created, LSN=45790
2020-09-24T17:18:07.649634Z 0[Warning] InnoDB: Creating foreign key constraint system tables.2020-09-24T17:18:07.798293Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: e9febf85-fe89-11ea-b247-000c2932f416.2020-09-24T17:18:07.814479Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed'cannot be opened.2020-09-24T17:18:07.842511Z 1 [Note] A temporary password is generated for root@localhost: =;pWEA#kr1zi
注意最后一行,这也是和之有版本不同的地方,它给了root一个初始密码,后面要登录的时候要用到这个密码。
切换用户到rootsu -root
# 备份原来的my.cnf文件mv my.cnf my.cnf.bak
#复制配置文件和启动文件到/etc/下
cd /usr/local/mysql/support-files
#复制MySQL的配置文件cp my-default.cnf /etc/my.cnf
#复制启动文件到系统服务下,可以以服务启动cp mysql.server /etc/init.d/mysql
#配置启动文件
vim /etc/init.d/mysql
#添加以下两行
(文件里正好有
basedir=datadir=这样的两行,直接填上就可以了)
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
# 配置环境变量
vi /etc/profile
#添加以下两行
export MYSQL_HOME=/usr/local/mysql
export PATH=$MYSQL_HOME/bin:$PATH
# 环境变量立即生效
source/etc/profile
#配置mysql服务开机自动启动
chkconfig --add mysql
chkconfig mysql on
启动mysql
service mysql start
#登录MySQL
mysql -uroot -p
> 输入初始化最后一行中的密码就可以登录
#登录后,第一次修改密码必须用alter语句
alter user 'root'@'localhost' identified by 'root123' PASSWORD EXPIRE NEVER account unlock;
#设置登录权限(使得root用户可以从任何机器上登录数据库)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root123'WITH GRANT OPTION;
#立即生效
flush privileges;
配置my.cnf配置文件
vi /etc/my.cnf
#修改忽略大小写
lower_case_table_names=1#[mysqld]下
# 修改连接数
max_connections=1000 #[mysqld]下
#重启MySQL
service mysql restart
#登录数据库后验证连接数修改完成
show variables like '%max_connections%';
#关闭防火墙
service iptables stop
#创建数据库
create database `auto1` default character set utf8 collate utf8_general_ci;
*******************************************************************以上在两台数据库服务器操作都是一样的*****************************************************************
# 配置同步(192.168.174.5/192.168.174.2)
=================================================================服务器192.168.174.5============================================================================
#相互授权
grant replication slave,file, select on *.* to 'mstest'@'192.168.174.2' identified by 'root123';
#立即生效
flush privileges;
#退出数据库vi /etc/my.cnf
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
#可以为任意自然数,必须保证两台mysql主机不重复
server-id=2log-bin=mysql-bin
binlog_format=mixed
binlog-do-db=auto1
binlog-ignore-db=mysql
#要同步的数据库,如果需要就填,指定数据库的名称即可,默认为所有库,声明了不同步就默认除了不同步数据库意外的所有库。
replicate-do-db=auto1
replicate-ignore-db=mysql
log-slave-updates
slave-skip-errors=all
#auto_increment_increment=2#auto_increment_offset=2
#重启数据库
service mysql restart
#登录数据库
mysql>show master status;+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | auto1 | mysql | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00sec)
mysql>stop slave;
Query OK,0 rows affected, 1 warning (0.00sec)
#master_log_file='mysql-bin.000002',#配置是的192.168.174.2那边查到的数据
mysql> change master to master_host='192.168.174.2',master_user='mstest',master_password='root123',master_log_file='mysql-bin.000001',master_log_pos=154;
Query OK,0 rows affected, 2 warnings (0.10sec)
mysql>start slave;
Query OK,0 rows affected (0.00 sec)
====================================================================服务器192.168.174.2======================================================================
#相互授权
grant replication slave,file, select on *.* to 'mstest'@'192.168.174.5' identified by 'root123';
#立即生效
flush privileges;
#退出数据库vi /etc/my.cnf
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
#可以为任意自然数,必须保证两台mysql主机不重复
server-id=3log-bin=mysql-bin
binlog_format=mixed
binlog-do-db=auto1
binlog-ignore-db=mysql
#要同步的数据库,如果需要就填,指定数据库的名称即可,默认为所有库,声明了不同步就默认除了不同步数据库意外的所有库。
replicate-do-db=auto1
replicate-ignore-db=mysql
log-slave-updates
slave-skip-errors=all
#auto_increment_increment=2#auto_increment_offset=2
#重启数据库
service mysql restart
#登录数据库
mysql>show master status;+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | auto1 | mysql | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00sec)
mysql>stop slave;
Query OK,0 rows affected, 1 warning (0.00sec)
# master_log_file='mysql-bin.000002',#配置是的192.168.174.5那边查到的数据
mysql> change master to master_host='192.168.174.5',master_user='mstest',master_password='root123',master_log_file='mysql-bin.000001',master_log_pos=154;
Query OK,0 rows affected, 2 warnings (0.04sec)
mysql>start slave;
Query OK,0 rows affected (0.01 sec)
192.168.174.5下
mysql>show slave status\G;*************************** 1. row ***************************Slave_IO_State: Waitingformaster to send event
Master_Host:192.168.174.2Master_User: mstest
Master_Port:3306Connect_Retry:60Master_Log_File: mysql-bin.000001Read_Master_Log_Pos:548Relay_Log_File: t-enter-relay-bin.000002Relay_Log_Pos:517Relay_Master_Log_File: mysql-bin.000001Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: auto1
Replicate_Ignore_DB: mysql
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno:0Last_Error:
Skip_Counter:0Exec_Master_Log_Pos:548Relay_Log_Space:726Until_Condition: None
。。。。。。。。。。
192.168.174.2下
mysql>show slave status\G;*************************** 1. row ***************************Slave_IO_State: Waitingformaster to send event
Master_Host:192.168.174.5Master_User: mstest
Master_Port:3306Connect_Retry:60Master_Log_File: mysql-bin.000001Read_Master_Log_Pos:548Relay_Log_File: py-my-relay-bin.000002Relay_Log_Pos:517Relay_Master_Log_File: mysql-bin.000001Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: auto1
Replicate_Ignore_DB: mysql
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno:0Last_Error:
Skip_Counter:0Exec_Master_Log_Pos:548Relay_Log_Space:724Until_Condition: None
。。。。。。。。
#这两个指标为yes说明配置完成
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
验证一下
在192.168.174.5上的auto1库下创建table1,在192.168.174.2上查询auto1库下的库,有table1
在192.168.174.2上的auto1库下创建table2,在192.168.174.5上查询auto1库下的库,有table2