mysql实现主从复制记录
情况是两台机器
master(10.14.2.155)
slave(10.14.2.236)
互相能ping通
先关防火墙(仅限内网,外网不建议)
[root@localhost /]# chkconfig iptables off
[root@localhost /]# service iptables stop
[root@localhost ~]# yum install mysql mysql-server mysql-devel -y
两台机器安装mysql
安装完成,启动Mysql服务:
service mysqld start
一、创建同步资源:
修改mysql密码:
mysqladmin -u root password 'root'
创建同步用户 repl,密码123456
create user 'repl' identified by '123456';
用户建好后需要给其设置一些权限,比如写入查询建表登录等。
master命令:
grant all privileges on *.* to 'repl'@'*' with
grant option;grant all privileges on *.* to 'repl'@'%' with grant option;
grant all privileges on *.* to 'repl'@'localhost' with grant option;
grant all privileges on *.* to 'repl'@'Master' with grant option;
flush privileges;
slave命令:
grant all privileges on *.* to 'repl'@'*' with grant option;
grant all privileges on *.* to 'repl'@'%' with grant option;
grant all privileges on *.* to 'repl'@'localhost' with grant option;
grant all privileges on *.* to 'repl'@'Slave' with grant option;
flush privileges;
创建同步数据库:
create database repldb;
show databases;
接下来测试创建用户登录Mysql
mysql -urepl -p123456
2、主从配置
修改master的mysql配置文件mycnf,在mysqld模块下添加如下选项(默认在/etc/my.cnf,找不到请find命令查找):
log-bin=mysql-bin #表示启用mysql二进制日志,
#该项必须要启用,否则mysql主从不会生效。
max_binlog_size=500M #表示每个binlog文件最大大小,
#当此文件大小等于500M时,会自动生成一个新的日志文件。
#注意:一条记录不会写在2个日志文件中,所以有时日志文件会超过此大小。
server-id=1 #表示mysql服务器ID,该ID必须在该主从中是唯一的,
#默认是1,该ID可以自行自定义,但必须为数字。
binlog-do-db=repldb #表示需要同步的数据库名字,如果是多个数据库,就以此格式再写一行即可。
binlog-ignore-db=mysql #表示不需要同步的数据库名字,如果是多个数据库,就以此格式再写一行即可。
#如不加binlog-do-db和binlog-ignore-db,默认同步复制整个mysql数据库。
innodb_flush_log_at_trx_commit=1 #当MySQL的存储引擎是InnoDB时,表示每次事务提交时,刷出日志。
#虽然性能较慢,但是能够保证强一致性。
sync_binlog=1 #设置MySQL在每次事务提交后,执行一次磁盘同步指令,#将binlog_cache中的数据强制写入磁盘。
#最后面两个参数可以根据实际生产环境对数据一致性的刚醒需求程度来决定是否添加。
为了让备份机器同步时能够通过repl身份登录主节点,需要在master一root登录mysql ,给slave的用户赋予replication slave权限:
mysql -uroot -p
grant replication slave,file on *.* to 'repl'@'10.14.2.236' identified by '123456';
flush privileges;
use mysql;
select user,repl_slave_priv from user where user='repl';
查看权限
配置后重启mysql
service mysqld restart
接下来锁住Master的表,禁止写权限,并记录日志文件名和起始位置、
flush tables with read lock;
show master status;
show master status\G;
接下来操作是Slave端
修改slave的my.cnf:
server-id=2
replicate-do-db=repldb
replicate-ignore-db=mysql
重启mysql:service mysqld restart
mysql -uroot -p
show slave status;
show slave status\G;
在Slave执行下面命令。创建Slave到Master的Replication:
slave stop;
CHANGE MASTER TO MASTER_HOST='10.14.2.155',MASTER_USER='repl',MASTER_PASSWORD='123456',MASTER_PORT=3306,MASTER_CONNECT_RETRY=60,MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=106;
slave start;
show slave status\G;
在执行 CHANGE MASTER TO 语句之前,一定要先执行 SLAVE STOP 指令。MASTER_HOST 表示需要进行同步的 MySQL 库所在的主机名,可以写 IP 地址,也可以填写 HOSTNAME。MASTER_LOG_FILE 和 MASTER_LOG_POS 一定要和在 Master 端执行show master status 命令的结果保持一致,否则无法同步。最后需要执行 SLAVE START 指令,开始主从同步。
3、接下来在master执行解锁:unlock tables;
三、测试主从复制:
1、在master登录并在其中创建表test,并插入数据,然后查看slave中数据是否存在。
master:
mysql -uroot -p
use repldb;
create table test(tc1 int, tc2 int);
insert into test values(1,2);
insert into test values(3,4);
slave:
mysql -uroot -p
use repldb;
select * from test;
可以看到,数据已经同步过来了。