MySQL Replication 即主从复制
MySQL Replication主要用于MySQL的时时备份或者读写分离。在配置之前先做一下准备工作,配置两台mysql服务器,或者在一台服务器上配置两个端口也可以。流程示意图:
A-->change data-->bin_log-->transfer-->B-->repl_log-->change data
一、搭建好了一个mysql,跑的是3306端口。
1、下载mysql到/usr/local/src/
wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
2、解压缩
tar zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
3.把解压完的数据移动到/usr/local/mysql
mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql
4.建立mysql用户
useradd -s /sbin/nologin mysql
5.初始化数据库
cd /usr/local/mysql
mkdir -p /data/mysql
chown -R mysql:mysql /data/mysql
./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
6.拷贝配置文件
cp support-files/my-large.cnf /etc/my.cnf拷贝配置文件
7.拷贝启动脚本文件并修改其属性
cp support-files/mysql.server /etc/init.d/mysqld
chmod 755 /etc/init.d/mysqld
8.修改启动脚本
vim /etc/init.d/mysqld
需要修改的地方有 “datadir=/data/mysql”
basedir=/usr/local/mysql
9.把启动脚本加入系统服务项,并设定开机启动,启动mysql
chkconfig --add mysqld
chkconfigmysqld on 或servicemysqldstart或/etc/init.d/mysqldstart
检查mysqld是否启动的命令为:ps aux |grep mysqld
二、下面再搭建一个3307端口的mysql:
# mkdir/data/mysql_slave
# chown-Rmt=ysql:mysql/data/mysql_slave
# cd /usr/local/
# cp -r mysql mysql_slave
# cd mysql2
#./scripts/mysql_install_db --user=mysql --datadir=/data/mysql_slave
# cp /etc/my.cnf .
# vim my.cnf
【mysqld】
改为:port = 3307
改为:socket = /tmp/mysql_slave.sock
在这一行的下面再加一行:
datadir= /data/mysql_slave
保存后就可以启动它了:
# cd bin/
# ./mysqld_safe --defaults-file=../my.cnf --user=mysql &
重启:pid=`ps aux|grep mysql2.sock|grep -v grep|awk '{print $2}'`;kill $pid;cd /usr/local/mysql2/bin/; ./mysqld_safe --default-file=../my.cnf --user=mysql &
若开机启动,需要把启动命令加入到/etc/rc.local中
如果想跟mysqld一样脚本启动,则:
# cd /etc/init.d/
# cp mysqld mysqldslave
vim mysqldslave
改datadir=/data/mysql” 为 datadir=/data/mysql_slave
basedir=/usr/local/mysql 为 basedir=/usr/local/mysql_slave
改conf=/etc/my.cnf 为 conf=$basedir/my.cnf
也可以配置到/etc/init.d/mysqlslave
cp -r mysql mysql_slave
同样修改
basedir=/usr/local/mysql_slave
datadir=/data/mysql_slave
conf=$basedir/my.cnf
后面的conf路径
conf=$basedir/my.cnf
但是不能使用/etc/init.d/mysqlslave start启动
可以使用service mysqlslave start
# chkconfig --add mysqldslave
# chkconfig mysqldslave on
# chkconfig --add mysqld
# chkconfig mysqld on
也可以将写入到/etc/rc.d/rc.local文件中:
echo "./mysqld_safe --defaults-file=../my.cnf --user=mysql &" >>/etc/rc.d/rc.local
三、在主服务器上创建测试数据库:
三、在主服务器上创建测试数据库:
登录两台mysql
mysql -h127.0.0.1 -P3306 #通过主机端口登陆
mysql -h127.0.0.1 -P3307
mysql -S /tmp/mysql.sock #通过sock登陆
mysql -S /tmp/mysql_slave.sock
mysql -uroot-p密码#通过密码登陆
登录mysql:/usr/local/mysql/bin/mysql -uroot-p199610
或mysql -S /tmp/mysql.sock
登录mysql_slave:mysql -S /tmp/mysql_slave.sock 或者mysql -h127.0.0.1 -P3307 (无密)
把3306端口的mysql作为主(master),而把3307的mysql作为从(slave)
为了让实验更加像生产环境,先在master上创建一个库db1
# mysql -uroot -S /tmp/mysql.sock -p199610
mysql> create database db1;
Query OK, 1 row affected (0.01 sec)
mysql> quit
Bye
// -S 后面指定mysql的socket文件路径,这也是登陆mysql的一种方法,因为在一台服务器上跑了两个mysql端口,所以,只能用 -S 这样的方法来区分。
创建了db1库,然后把mysql库的数据复制给它:
mysqldump -uroot -S /tmp/mysql.sock mysql > 123.sql #备份
mysql -uroot -S /tmp/mysql.sock db1 grant replication slave on *.* to 'repl'@'127.0.0.1' identified by '123456';
//这里的repl是为slave端设置的访问master端mysql数据的用户,密码为123456,这里的127.0.0.1为slave的ip(因为我们配置的master和slave都在本机)。
mysql> flush privileges; #刷新
mysql>flush tables with read lock; #锁定数据库,此时不允许更改任何数据
mysql>unlock tables;
mysql> show master status;#查看状态,这些数据是要记录的,一会要在slave端用到
+--------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------+----------+--------------+------------------+
| aiker.000001 | 587 | | |
+--------------+----------+--------------+------------------+
1 row in set (0.00 sec)
[*]设置slave 先修改slave的配置文件my.cnf:
vim /usr/local/mysql_slave/my.cnf
找到 “server-id = 1” 这一行,删除掉或者改为 “server-id = 2” 总之不能让这个id和master一样,否则会报错。
另外在从上,如下两行,黑白名单,看主mysql有没有配置
replicate-do-db=db1,db2
replicate-ignore-db=db1,db2
改完后,重启slave:
service mysqld_slave restart
拷贝master上的db1库的数据到slave上,因为master和slave都在一台服务器上,所以操作起来简单了很多,如果是不同的机器,可能就需要远程拷贝了,希望你注意这一点:
# mysqldump -uroot -S /tmp/mysql.sock -pyourpassword db1 > 123.sql
# mysql -uroot -S /tmp/mysql_slave.sock -pyourpassword -e "create database db1"
# mysql -uroot -S /tmp/mysql_slave.sock -pyourpassword db1 slave stop;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> change master to master_host='127.0.0.1',master_port=3306,master_user='repl', master_password='123123',master_log_file='aiker.000001', master_log_pos=587;
Query OK, 0 rows affected (0.02 sec)
mysql> slave start;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G
在主mysql上解锁
mysql -uroot -S/tmp/mysql_slave.sock -p123123 -e"unlock tables"
或者
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
3、测试主从
在master上执行如下命令:
# mysql -uroot -S /tmp/mysql.sock -pederew -e "use db1;select count(*) from db"
+----------+
| count(*) |
+----------+
| 2 |
+----------+
# mysql -uroot -S /tmp/mysql.sock -pederew -e "use db1;truncate table db" 清空db1的表
# mysql -uroot -S /tmp/mysql.sock -pederew -e "use db1;select count(*) from db"
+----------+
| count(*) |
+----------+
| 0 |
+----------+
# mysql -S /tmp/mysql_slave.sock -e "use db1;select count(*) from db"
+----------+
| count(*) |
+----------+
| 0 |
+----------+
slave上的该表也被清空了。这样好像不太明显,不妨继续把db表删除试试:
# mysql -S /tmp/mysql_slave.sock -e "use db1;select count(*) from db"
ERROR 1146 (42S02) at line 1: Table 'db1.db' doesn't exist
主从配置起来很简单,但是这种机制也是非常脆弱的,一旦我们不小心在从上写了数据,那么主从也就被破坏了。另外如果重启master,务必要先把slave停掉,也就是说需要在slave上去执行 slave stop 命令,然后再去重启master的mysql服务,否则很有可能就会中断了。当然重启完后,还需要把slave给开启 slavestart.
页:
[1]