1、环境准备:在一台服务器上搭建 2 个 MySQL 实例,其中,3306 端口的 MySQL 实例作为主库,3307 端口的 MySQL 实例作为从库
[root@localhost scripts]# netstat -lnp | grep 330
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 28934/mysqld
tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 29663/mysqld
2、主库上的操作
[root@localhost ~]# vim /data/3306/my.cnf # 修改主库配置文件
[mysqld] # 注意是在 mysqld 模块下server-id = 1 # 各个实例的 server-id 不能相同
log-bin = /data/3306/mysql-bin # 打开 binlog 日志
[root@localhost ~]# /data/3306/mysql restart # 重启服务
[root@localhost ~]# mysql -uroot -ppzk123 -S /data/3306/mysql.sockmysql> show variables like 'log_bin'; # 查看是否打开 binlog 日志
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+ # 建立用于从库复制的账号 rep
mysql> grant replication slave on *.* to 'rep'@'192.168.5.%' identified by 'pzk123';
mysql> flush privileges; # 刷新权限,使授权的权限生效
mysql> flush table with read lock; # 实现对主库锁表只读
# 重新打开一个终端导出数据库的所有数据
[root@localhost ~]# mkdir /data/3306/backup
[root@localhost ~]# mysqldump -uroot -ppzk123 -S /data/3306/mysql.sock --events -A -B | gzip > /data/3306/backup/mysql_bak.$(date +%F).sql.gz
mysql> unlock tables; # 导出数据后解锁主库,恢复可写
mysql> show master status; # 记住下面两个值,等下在从库会用到
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000011 | 333 | | |
+------------------+----------+--------------+------------------+
3、从库上的操作
[root@localhost ~]# vim /data/3307/my.cnf # 编辑从库的配置文件
server-id = 3 # 在主从复制中所有 server-id 不能相同
#log-bin = /data/3307/mysql-bin # 不要打开 binlog 日志
[root@localhost ~]# /data/3307/mysql restart # 重启数据库
[root@localhost ~]# cd /data/3306/backup/ # 把从主库 mysqldump 导出的数据恢复到从库
[root@localhost backup]# gzip -d mysql_bak.2017-05-25.sql.gz
[root@localhost backup]# mysql -uroot -ppzk123 -S /data/3307/mysql.sock < mysql_bak.2017-05-25.sql
# 登录从库,配置复制参数,实际上把用户密码等信息写入从库新的 master.info 文件中
mysql -uroot -ppzk123 -S /data/3307/mysql.sock << EOF
CHANGE MASTER TO
MASTER_HOST='192.168.5.131', # 主库 IP
MASTER_PORT=3306, # 主库端口
MASTER_USER='rep', # 用于主从复制的用户
MASTER_PASSWORD='pzk123', # 用户密码
MASTER_LOG_FILE='mysql-bin.000008', # 这里是 show master status 查看到的二进制日志文件名
MASTER_LOG_POS=342; # 这里是 show master status 查看到的二进制日志偏移量
EOF
[root@localhost ~]# mysql -uroot -ppzk123 -S /data/3307/mysql.sock -e "start slave;" # 启动主从复制
[root@localhost ~]# mysql -uroot -ppzk123 -S /data/3307/mysql.sock -e "show slave status\G;" # 查看主从复制是否成功
Slave_IO_Running: Yes # 这个是 I/O 线程状态,I/O 线程负责从从库到主库读取 binlog 日志,并写入从库的中继日志
Slave_SQL_Runngin: Yes # 这个是 SQL 线程状态,SQL 线程负责读取中继日志中的数据并转换为 SQL 语句应用到从数据库中
Seconds_Behind_master: 0 # 这个是复制过程中从库比主库延迟的秒数
[root@localhost ~]# mysql -uroot -ppzk123 -S /data/3306/mysql.sock -e "create database abc;" # 测试主从复制
[root@localhost ~]# mysql -uroot -ppzk123 -S /data/3307/mysql.sock -e "show databases like 'abc';"
+----------------+
| Database (abc) |
+----------------+
| abc |
+----------------+