MySQL主从复制结构是基于mysql bin-log日志基础上,从通过打开IO进程收到主的bin-log日志增量信息,并保存到本地relay log,而后再通过打开MYSQL进程从relay log上获取的增量信息而翻译成SQL语句后写到从数据库。 主从复制结构,实际上可以实现两个功能: 1.从充当主的数据库备份实例 2.可以实现读写分离,主负责正常读写数据,从只负责读数据,从而在一定意义上实现读写分离,缓解主的IO读的压力(因为很多应用实际读数据库的次数远大于写数据库的次数) 所以生产环境下推荐使用这种架构。
系统环境:centos6.3 x64 数据库: mysql-5.6.10
mysql master:192.168.100.90 mysql slave:192.168.100.91
一.部署环境:
1.关闭iptables和SELINUX # service iptables stop # setenforce 0 # vi /etc/sysconfig/selinux --------------- SELINUX=disabled ---------------
2.安装配置mysql传送门:http://showerlee.blog./2047005/1174141
二.主mysql配置:(mysql master)
修改mysql配置文件: # vi /etc/my.cnf 添加: ----------------- # Replication Master Server # bin日志路径 log-bin = /usr/local/mysql/log/bin.log # 服务器ID号 server-id = 1 # 忽略mysql数据库复制 binlog-ignore-db=mysql ------------ 重启服务 # service mysqld restart
登录mysql后台: # mysql -u root -p123456 查看此刻登录账号: > select user();
在master为slave添加同步帐号: > grant replication slave on *.* to 'slave'@'192.168.100.91' identified by '123456';
查看创建的用户: > select user.host from mysql.user;
查看权限: > show grants for 'slave'@'192.168.100.91';
mysql锁表只读(其他账户登录mysql后无法进行写表操作,防止备份数据库后,主mysql表更新,导致和从数据库内容不一致) > flush tables with read lock;
查看锁表倒计时时间: > show variables like '%timeout%'; ------------------------ ....
wait_timeout | 28800 ------------------------
将master的数据库表全部备份导出,并传送到slave服务器上。
# /usr/local/mysql/bin/mysqldump -u root -p123456 --opt --flush-logs --all-database > /root/allbak.sql # cd ~ # scp allbak.sql root@192.168.100.91:/root
查看mysql偏移量(数据库如果有写操作,偏移值会递增) # mysql -u root -p123456 -e "show master status" ---------------------- +------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------+----------+--------------+------------------+-------------------+ | bin.000009 | 120 | | | | +------------+----------+--------------+------------------+-------------------+ ---------------------- 保证FILE列和Position列与从库配置一致:
三.从mysql配置(mysql slave)
修改mysql配置文件: # vi /etc/my.cnf 添加: -------------------- # Replication Slave Server # bin日志路径(无需开bin-log日志) #log-bin = /usr/local/mysql/log/bin.log server-id=2 # 只读: read-only # 忽略mysql数据库复制 binlog-ignore-db=mysql ---------------------
重启服务 # service mysqld restart
恢复server的数据库到slave #/usr/local/mysql/bin/mysql -u root -p123456 < /root/allbak.sql
配置连接同步到server端: # mysql -u root -p123456; > stop slave; > change master to master_host='192.168.100.90',master_user='slave',master_password='123456',master_log_file="bin.000009",master_log_pos= 120 ; > start slave; 注:master_log_file表示从主数据库哪个bin-log文件开始同步 master_log_pos表示从该bin-log文件哪条记录点开始同步 需与主库偏移值保持同步
回到主mysql数据库解锁(mysql master) # mysql -u root -p123456 > unlock tables;
最后登陆从mysql后台查看主从连接状态 # mysql -u root -p123456 -e "show slave status\G;" 找到这五行,如下则主从配置成功: ------------------------ Slave_IO_State: Waiting for master to send event Slave_IO_Running: Yes Slave_SQL_Running: Yes Read_Master_Log_Pos: 120 Relay_Master_Log_File: bin.000009 -------------------------
四.测试主从是否同步: (server) # mysql -u root -p123456 -e "create database test02;" # mysql -u root -p123456 -e "show databases like 'test02';" ------------ +-------------------+ | Database (test02) | +-------------------+ | test02 | +-------------------+ ------------ (cilent) # mysql -u root -p123456 -e "show databases like 'test02';" ------------- +-------------------+ | Database (test02) | +-------------------+ | test02 | +-------------------+ ------------- 测试成功。。
当server端的数据库数据发生变化时,client端会同步更新,从而实现主库备份和读写分离作用。
|