|
MySQL的主从配置
MySQL Replication 又叫做AB复制或者主从复制。它主要用于MySQL的时时备份或者读写分离,可以配置两台mysql服务器,或者在一台服务器上配置两个端口,本篇文章使用第二种方法。
一、首先配置好第一个mysql服务器
二、安装第二个mysql
1、拷贝并且修改配置文件
[iyunv@daixuan local]# cp -r mysql mysql_slave
[iyunv@daixuan local]# cd mysql_slave
[iyunv@daixuan mysql_slave]# mkdir /data/mysql_slave
[iyunv@daixuan mysql_slave]# chown -R mysql:mysql /data/mysql_slave
[iyunv@daixuan mysql_slave]# cp /etc/my.cnf .
[iyunv@daixuan mysql_slave]# vim my.cnf //注意,这里修改的是MySQL server,不是client
# The MySQL server
[mysqld]
port = 3307 //修改端口
socket = /tmp/mysql_slave.sock
datadir = /data/mysql_slave //添加datadir目录
[iyunv@daixuan mysql_slave]# pwd
/usr/local/mysql_slave
[iyunv@daixuan mysql_slave]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql_slave
[iyunv@daixuan mysql_slave]# ls /data/mysql_slave/ //初始化数据库后有两个目录
mysql test
2、配置slave
[iyunv@daixuan mysql_slave]# cd /etc/init.d
[iyunv@daixuan init.d]# cp mysqld mysqld_slave
[iyunv@daixuan init.d]# vim !$
vim mysqld_slave
修改:
basedir=/usr/local/mysql_slave
datadir=/data/mysql_slave
conf=$basedir/my.cnf
把文件中的其他的conf=/etc/my.cnf修改为conf=$basedir/my.cnf
# Try to find basedir in /etc/my.cnf
conf=/etc/my.cnf
修改为
# Try to find basedir in /etc/my.cnf
conf=$basedir/my.cnf
3、启动slave
方法一:
[iyunv@daixuan init.d]# /etc/init.d/mysqld_slave start //启动mysql_slave
Starting MySQL. SUCCESS!
方法二:
[iyunv@daixuan mysql_slave]# cd bin
[iyunv@daixuan bin]# ./mysqld_safe --defaults-file=../my.cnf --user=mysql &
如果以后想开机启动,就把它加入/etc/rc.d/rc.local文件中:
[iyunv@daixuan bin]# echo "./mysqld_safe --defaults-file=../my.cnf --user=mysql &" >>/etc/rc.d/rc.local
[iyunv@daixuan bin]# netstat -lnp | grep mysqld
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 9659/mysqld
tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 10436/mysqld
三、配置Replication
登录同一台服务器的两个不同的mysql,首先在master上创建一个库db1
[iyunv@daixuan init.d]# ls /tmp/
mysql_slave.sock mysql.sock
使用mysql.sock登录的是master,mysql_slave.sock登录的是slave
[iyunv@daixuan mysql_slave]# mysql -uroot -S /tmp/mysql.sock 或者使用命令
[iyunv@daixuan ~]# mysql -h127.0.0.1 -P3306
mysql> create database db1;
mysql> use db1
mysql> show tables;
Empty set (0.00 sec)
把mysql库的数据复制给它:
[iyunv@daixuan ~]# mysqldump -S /tmp/mysql.sock mysql >123.sql
[iyunv@daixuan ~]# mysql -uroot -S /tmp/mysql.sock db1 < 123.sql
[iyunv@daixuan ~]# mysql -uroot -S /tmp/mysql.sock
mysql> show tables;
+---------------------------+
| Tables_in_db1 |
+---------------------------+
| columns_priv |
| db |
| event |
1. 设置master
修改配置文件:
[iyunv@daixuan mysql]# vim /etc/my.cnf
在[mysqld]部分查看是否有以下内容,如果没有则添加:
server-id=1
log-bin=daixuan
除了这两行是必须的外,还有两个参数,你可以选择性的使用:
binlog-do-db=db1,db2 //设置同步的白名单,同步db1和db2
binlog-ignore-db=db1,db2 //设置同步的黑名单,不同步db1和db2,其他数据库都同步
binlog-do-db=需要复制的数据库名,多个数据库名,使用逗号分隔。binlog-ignore-db=不需要复制的数据库库名,多个数据库名,使用逗号分隔。这两个参数其实只用一个。
如果修改过配置文件,需要重启mysqld服务,否则不需要重启:
[iyunv@daixuan ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
[iyunv@daixuan ~]# ls /data/mysql //可以查看到daixuan开头的bin_log
daixuan.000001 daixuan.index db1
设置mysql中传输bin_log的用户,只给rpel赋予replication的权限
mysql> grant replication slave on *.* to 'repl'@'127.0.0.1' identified by '123123'; //这里的repl是为slave端设置的访问master端mysql数据的用户,密码为123123,这里的127.0.0.1为slave的ip(因为这里配置的master和slave都在本机)。
mysql> flush privileges; //刷新权限
mysql> flush tables with read lock; //锁定数据库,此时不允许更改任何数据
mysql> show master status;//查看状态,这些数据是要记录的,一会要在slave端用到
+----------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------+----------+--------------+------------------+
| daixuan.000001 | 406 | | |
+----------------+----------+--------------+------------------+
1 row in set (0.00 sec)
2. 设置slave
先修改slave的配置文件my.cnf:
[iyunv@daixuan ~]# vim /usr/local/mysql_slave/my.cnf
找到 “server-id = 1” 这一行,删除掉或者改为 “server-id = 2” 总之不能让这个id和master一样,否则会报错。另外在从上,你也可以选择性的增加如下两行,对应于主上增加的两行:
replicate-do-db=db1,db2
replicate-ignore-db=db1,db2
改完后,重启slave,server-id = 1才能生效:
[iyunv@daixuan ~]# service mysqld_slave restart
Shutting down MySQL. SUCCESS!
Starting MySQL. SUCCESS!
拷贝master上的db1库的数据到slave上,因为master和slave都在一台服务器上,所以操作起来简单了很多,如果是不同的机器,可能就需要远程拷贝了,希望你注意这一点:
[iyunv@daixuan ~]# mysql -S /tmp/mysql_slave.sock -e "create database db1"//创建数据库db1
[iyunv@daixuan ~]# mysql -S /tmp/mysql_slave.sock db1<123.sql //导入备份数据123.sql到db1
使用了一个-e选项,它用来把mysql的命令写到shell中,这样可以方便把mysql操作写进脚本中,它的格式就是 -e "commond" ,
在slave上配置主从了:
[iyunv@daixuan ~]# mysql -uroot -S /tmp/mysql_slave.sock
mysql> slave stop;
Query OK, 0 rows affected (0.06 sec)
mysql> slave start;
Query OK, 0 rows affected (0.01 sec)
其中master_log_file和master_log_pos是在上面使用 show master status 查到的数据。执行完这一步后,需要在master上执行一步:
[iyunv@daixuan ~]# mysql -uroot -S /tmp/mysql.sock -e "unlock tables"
然后查看slave的状态:
mysql> show slave status\G;
确认以下两项参数都为yes:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
四、测试主从
在master上执行如下命令:
[iyunv@daixuan ~]# mysql -uroot -S /tmp/mysql.sock
mysql> unlock tables;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 |
| mysql |
| test |
+--------------------+
4 rows in set (0.01 sec)
mysql> drop database db1;
Query OK, 22 rows affected (0.02 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema | //这里db1数据库已经被删除
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
下面查看slave上的该表数据:
[iyunv@daixuan ~]# mysql -uroot -S /tmp/mysql_slave.sock
mysql> show databases;
+--------------------+
| Database | //slave上的db1也已经被删除了,与主是同步的
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
主从配置起来很简单,但是这种机制也是非常脆弱的,一旦我们不小心在从上写了数据,那么主从也就被破坏了。另外如果重启master,务必要先把slave停掉,也就是说需要在slave上去执行 slave stop 命令,然后再去重启master的mysql服务,否则很有可能就会中断了。当然重启完后,还需要把slave给开启 slave start.
|
|