本文共 4244 字,大约阅读时间需要 14 分钟。
MySQL 的主从复制机制通过二进制日志实现数据同步。主服务器将更新写入二进制日志文件,并通过索引跟踪日志循环。这些日志记录发送到从服务器的更新。当从服务器连接到主服务器时,它通知主服务器从哪里开始读取日志。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
MySQL 使用三个线程执行复制功能:一个在主服务器上,另两个在从服务器上。当执行 START SLAVE
时,从服务器创建一个 I/O 线程,用于连接主服务器并接收二进制日志内容。主服务器创建一个线程,将二进制日志内容发送到从服务器。从服务器的 I/O 线程读取这些内容并拷贝到本地文件(中继日志)中。第三个线程是 SQL 线程,用于读取中继日志并执行其中的更新。
Red Hat Enterprise Linux Server release 6.7 (Santiago)
主服务器 (mysql2)
IP: 172.16.115.245主机名称: mysql2server_id: 245从服务器 (mysql3)
IP: 172.16.115.247主机名称: mysql3server_id: 247主从服务器均已安装 MySQL 5.7.18。
为主服务器创建一个连接账户并授予 REPLICATION SLAVE
权限:
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl@20170509';
修改主服务器的 my.cnf
配置文件:
server-id = 245log_bin = /data/mysqllog/3306/bin_log/binlog
确保以上值设置完成后重启 MySQL。
备份主服务器上的完整数据:
mysqldump -uroot -p'密码' --master-data=2 --single-transaction -R --triggers -A > /backup/all.sql
说明:
--master-data=2
记录主库的 Binlog 位置和 Position。--single-transaction
获取一致性快照。-R
备份存储过程和函数。-A
备份所有数据库。查看主库备份时的 Binlog 名称和位置:
SHOW MASTER STATUS;
或者查看备份文件:
vi all.sql
修改从服务器的 my.cnf
配置文件:
server-id = 247log_bin = /data/mysql/logdir/3306/binloginnodb_file_per_table = ONskip_name_resolve = ONrelay_log = /data/mysql/logdir/3306/relay_log/relay.logbinlog-format = rowlog-slave-updates = trueread_only = ON
设置完成后重启 MySQL。
在从服务器上恢复主库备份:
mysql -uroot -p'密码' < all.sql
停止从库并配置主从参数,启动从库:
mysql > stop slave;mysql > CHANGE MASTER TO MASTER_HOST='172.16.115.245', MASTER_USER='repl', MASTER_PASSWORD='repl@20170509', MASTER_LOG_FILE='binlog.000004', MASTER_LOG_POS=154;mysql > start slave;
查看主从进程:
SHOW PROCESSLIST \G
查看从库状态:
SHOW SLAVE STATUS \G
期望结果:
Slave_IO_State
: Waiting for master to send eventSlave_SQL_Running
: Yes下载并解压:
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.18-linux-glibc2.5-x86_64.tar.gztar xf mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz -C /usr/local/cd /usr/local/ln -sv mysql-5.7.18-linux-glibc2.5-x86_64/ mysql
新建用户组和用户:
groupadd mysqluseradd -g mysql -r -s /sbin/nologin -M -d /data/mysqldata mysql
分配目录权限:
chown -R mysql:mysql /usr/local/mysqlmkdir -p /data/mysqldatachmod -R 770 /data/mysqldatachown -R mysql:mysql /data/mysqldata
初始化 MySQL:
cd /usr/local/mysql./bin/mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysqldata --initialize
记录初始化密码:
./bin/mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysqldata --initialize --password='你的密码'
配置服务并重启:
cp support-files/mysql.server /etc/init.d/mysqldldconfigecho "PATH=$PATH:/usr/local/mysql/bin" > /etc/profile.d/mysql.shsource /etc/profile.d/mysql.shchkconfig mysqld on
修改 my.cnf
并重启服务:
vim /etc/my.cnfservice mysqld start
修改密码:
mysql -uroot -pdSrp%=Gdw4y:mysql > set password='你的新密码';mysql > FLUSH PRIVILEGES;
关闭防火墙:
service iptables stopchkconfig iptables off
配置远程访问:
mysql > use mysql;mysql > update user set host = '%' where user = 'root';mysql > flush privileges;
修改 my.cnf
:
log_bin = mysql-binserver-id = 1binlog-do-db=employeesbinlog-ignore-db=mysqlbinlog-ignore-db=information_schemabinlog-ignore-db=performance_schemabinlog-ignore-db=sysexpire_logs_days=7
重启数据库并测试:
service mysqld restartmysql > SHOW VARIABLES LIKE '%log_bin%';
mysql > GRANT REPLICATION SLAVE ON *.* TO 'backup'@'%' IDENTIFIED BY '你的密码';
在主服务器备份:
mysqldump -uroot -p'你的密码' -h localhost employees > /opt/employees.bak
在从服务器恢复:
scp /opt/employees.bak root@192.168.1.233:/opt/
从服务器恢复数据并启动复制:
mysql -uroot -p'你的密码' employees < /opt/employees.bakservice mysqld restart
修改 my.cnf
并添加以下参数:
read_only = 1master_info_repository=TABLErelay_log_info_repository=TABLE
重启数据库:
service mysqld restart
启动复制并验证状态:
mysql > stop slave;mysql > CHANGE MASTER TO MASTER_HOST='192.168.1.222', MASTER_USER='backup', MASTER_PASSWORD='你的密码', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=154;mysql > start slave;mysql > SHOW SLAVE STATUS \G
在主服务器创建新表并插入数据:
use employees;create table test001(id int auto_increment primary key, name varchar(20) not null);insert into test001 values(null, '会');insert into test001 values(null, '今');
在从服务器查看数据:
use employees;show tables;select * from test001;
通过以上步骤,主从复制配置完成,数据同步正常。
转载地址:http://ljbfk.baihongyu.com/