MySQL Replication配置
2 配置 Replication
2.1 设置主(master)
2.2 设置从(slave)
MySQL Replication配置
MySQL Replication又称“AB复制”或者“主从复制”,他主要用于MySQL的实时备份或者读写分离。在配置之前先做一下准备工作:配置两台MySQL服务器,或者一台服务器配置两个端口。本次实验为一台服务器上运行两个MySQL。
1 配置MySQL服务
之前搭建了3306端口的MySQL,现搭建3307的MySQL
# cd /usr/local/ # cp -r mysql mysql_2 # cd mysql_2 # ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql2
完整搭建MySQL代码(上面配置出错再回来看):
# /usr/local/src/ # wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz # tar zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz # mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql # useradd -s /sbin/nologin mysql # cd /usr/local/mysql # mkdir -p /data/mysql # chown -R mysql:mysql /data/mysql # ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql # cp support-files/my-default.cnf /etc/my.cnf # vim /etc/my.cnf //修改参数 innodb_buffer_size = 128M log_bin = aminglinux basedir = /usr/local/mysql datadir = /data/mysql port = 3306 server_id = 128 socket = /tmp/mysql.sock join_buffer_size = 128M sort_buffer_size = 2M red_rnd_buffer_size = 2M sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES # cp support-files/mysql.server /etc/init.d/mysqld # chmod 755 /etc/init.d/mysqld # vim /etc/init.d/mysqld datadir=/data/mysql # chkconfig --add mysqld # chkconfig mysqld on # service mysqld start # ps aux |grep mysqld
然后初始化数据库目录,显示两个“OK”并生成/data/mysql2目录才正确;错误请查看15章详细步骤。
复制配置文件到/usr/local/mysql_2目录下
# cp /etc/my.cnf ./my.cnf # vim my.cnf //修改部分参数 log_bin = aminglinux2 basedir = /usr/local/mysql_2 datadir = /data/mysql2 port = 3307 server_id = 129 socket = /tmp/mysql2.sock
复制启动脚本并编辑
# cp support-files/mysql.server /etc/init.d/mysqld2 # vim /etc/init.d/mysqld2 //改 basedir=/usr/local/mysql_2 datadir=/data/mysql2 $bindir/mysqld_safe --defaults-file=$basedir/my.cnf --datadir="$datadir" --pid-file="$mysql_pid_file_path" $other_args >/dev/null & 第三行为启动命令,增加了--defaults参数,若不增加则不能正确找到mysql_2的配置文件。
启动两个MySQL:
# /etc/init.d/mysqld start # /etc/init.d/mysqld2 start # netstat -lnp |grep mysql tcp6 0 0 :::3306 :::* LISTEN 21388/mysqld tcp6 0 0 :::3307 :::* LISTEN 21787/mysqld unix 2 [ ACC ] STREAM LISTENING 154331 21787/mysqld /tmp/mysql2.sock unix 2 [ ACC ] STREAM LISTENING 152879 21388/mysqld /tmp/mysql.sock
2 配置 Replication
打算把3307端口的MySQL作为主(master),把3306的MySQL作为从(slave)。为了让实验更接近生产环境,先在master上创建一个库aming。
# mysql -uroot -S /tmp/mysql2.sock mysql> create database aming; mysql> quit
-S(大写)后面指定MySQL的socket文件路径,这也是登录MySQL的一种方法。因为一台服务器上运行两个MySQL端口,所以用-S这样的方法来区分。
然后先把mysql库的数据复制给aming库,如下:
# mysqldump -uroot -S /tmp/mysql2.sock mysql > /tmp/aming.sql # mysql -uroot -S /tmp/mysql2.sock aming < /tmp/aming.sql
2.1 设置主(master)
上面操作以将mysql_2的配置文件设置过相关的参数
如果还没有设置,请添加:
server_id=129 log_bin=aminglinux2 //下面两个参数选择性地使用 binlog-do-db=databasename1,databasename2 binlog-ignore-db=databasename1,databasename2
binlog-do-db=为定义需要复制的数据库,多个数据库用英文的逗号分隔
binlog-ignore-db=定义不需要复制的数据库,这两个参数用其中一个即可。
如果修改过配置文件,重启MySQL服务
# /etc/init.d/mysqld2 restart # mysqladmin -uroot -S /tmp/mysql2.sock password 'aminglinux.com' # mysql -uroot -S /tmp/mysql2.sock -p password: mysql> grant replication slave on *.* to 'repl'@'127.0.0.1' identified by '123lalala';
//这里repl是为从(slave)端设置的访问主(master)端的用户,也就是要完成主从复制的用户,这里的127.0.0.1为slave的IP(因为配置的master和slave都在本机)
锁定数据库写操作
mysql> flush tables with read lock;
查看mester的状态,这些数据要记录,一会在slave端用到:
mysql> show master status; File Position Binlog_Do_DB Binlog_Ignore_DB Executed_Gtid_Set aminglinxu2 652867
2.2 设置从(slave)
首先修改slave的配置文件my.cnf
# vim /etc/my.cnf 找到server_id=,设置成和master不一样的数字,若一样会导致后面的操作不成功。 在slave上,也可以选择性地增加如下两行,对应master增加的两行 binlog-do-db=databasename1,databasename2 binlog-ignore-db=databasename1,databasename2 # /etc/init.d/mysqld restart
复制master上aming库的数据到slave上。master和slave都在一台服务器上,操作很简单。如果是不同机器,需要远程复制(使用scp或rsync)
# mysqldump -uroot -S /tmp/mysql2.sock -p'aminglinux.com' aming > /tmp/amingl.sql # mysql -uroot -S /tmp/mysql.sock -p123456 -e "create database aming" # mysql -uroot -S /tmp/mysql.sock -p123456 aming < /tmp/aming.sql
-e:执行MySQL的内部命令。
在slave上配置
# mysql -uroot -S /tmp/mysql.sock -p123456 mysql> stop slave; mysql> change master to master_host='127.0.0.1', master_port=3307,master_user='repl', master_password='123lalala', master_log_file='aminglinux.000003', master_log_pos=652867; mysql> start slave;
ps:change master这个命令是一条,逗号接回车键,直到分号才算结束。
其中master_log_file和master_log_pos是在前面使用show master status命令查到的数据。
在master上执行(打开两个终端分别运行MySQL):
# msyql -uroot -S /tmp/mysql2.sock -p'aminglinux.com' -e 'unlock tables'
在slave端查看slave的状态
mysql> show slave status\G; ... Slave_IO_Running: Yes Slave_SQL_Runing: Yes ... Second_behind_Master: 0 //为主从复制延迟的时间 Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error:
如果主不正常,需要看这里的error信息。
3 测试主从
在master上执行
# mysql -uroot -S /tmp/mysql2.sock -p 'aminglinux.com' aming mysql> select count(*) from db; count(*) 2 mysql> truncate table db; //清空表数据 mysql> select count(*) from db; count(*) 0
清空了aming.db表的数据库。
查看slave上该表的数据:
# mysql -uroot -S /tmp/mysql.sock -p123456 aming mysql> select count(*) from db; count(*) 0
slave上的数据也被清空了。
但好像不太明显,不妨在master上继续删除db表:
mysql> drop table db;
再从slave查看:
mysql> select * from db; ERROR 1146 (42S02): Table 'aming.db' doesn't exist
这次很明显了,db表不见了。主从配置起来虽然很简单,但这种机制非常脆弱,一旦我们不小心在slave上写了数据,那么主从复制也就被破坏了。
另外,如果重启master,务必要先关闭slave,即在slave上执行slave stop命令,然后再去重启master的MySQL服务,否则主从复制很有可能就会中断。重启master后,我们还需要执行start slave命令开启主从复制的服务。