mysql主从复制
mysql主从复制介绍
mysql的主从复制是一个异步的复制过程(但一般情况下感觉是实时同步的),数据库数据从一个mysql数据库(我们称之为master)复制到另一个mysql数据库(我们称之为slave)。在master与slave之间实现整个主从复制的过程是由三个线程参与完成的。其中有两个线程(SQL线程和IO线程)在slave端,另外一个线程(IO线程)在master端。(来自mysql帮助文档)
下面简单描述下mysql replication的复制过程:
①slave服务器上执行start slave,开启主从复制开关。
②此时,slave服务的IO线程会通过msater上授权的复制用户权限请求连接master服务器,并请求从指定binlog日志文件的指定位置(日志文件名和位置就是在配置主从复***务时执行chage master命令时指定的)之后发送binlog日志内容。
③master服务器接收到来自slave服务器的IO线程的请求后,master服务器上复制复制的IO线程根据slave服务器的IO线程请求的信息读取指定binlog日志文件指定位置之后的binlog日志信息,然后返回给slave端的IO线程。返回的信息中除了binlog日志内容外,还有本次返回日志内容后在master服务器端的新的binlog文件名以及在binlog中的下一个指定更新位置。
④当slave服务器的IO线程获取来自master服务器上IO线程发送的日志内容及日志文件和位置点后,将binlog日志内容依次写入到slave端自身的relay log(即中继日志)文件(mysql-relay-bin.xxxxxx)的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取master端新binlog日志时能告诉master服务器需要从新binlog日志的哪个文件哪个位置开始请求新的binlog日志内容。
⑤slave服务器端的SQL线程会实时检测本地relay log中新增加的日志内容,然后及时的把log文件中的内容解析成在master端曾经执行的SQL语句的内容,并在自身slave服务器上按语句的顺序执行应用这些SQL语句,应用完毕后清理应用过的日志。
⑥经过了上面的过程,就可以确保在master端和slave端执行了同样的SQL语句。当辅助状态正常的情况下,master端和slave端的数据时完全一样的。(来自老男孩培训整理)
mysql主从复制简单原理图:
mysql主从部署(一主一从):
环境
主机名 | IP地址 | 系统版本 |
mysql-master | 192.168.1.11 | CentOS release 6.4 (Final) 2.6.32-358.el6.x86_64 |
mysql-slave | 192.168.1.12 | CentOS release 6.4 (Final) 2.6.32-358.el6.x86_64 |
安装mysql
yum install cmake -y
yum install ncurses-devel -y
useradd mysql -s /sbin/nologin -M
##############
cd /application/tools
#下载mysql参考地址http://mirrors.sohu.com/mysql/MySQL-5.5/
tar zxf mysql-5.5.32.tar.gz
cd mysql-5.5.32
cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.5.32 \
-DMYSQL_DATADIR=/application/mysql-5.5.32/data \
-DMYSQL_UNIX_ADDR=/application/mysql-5.5.32/tmp/mysql.sock \
-DDEFAULT_CHARSET=gbk \
-DDEFAULT_COLLATION=gbk_chinese_ci \
-DENABLED_LOCAL_INFILE=ON \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITHOUT_PARTITION_STORAGE_ENGINE=1
make
make install
######创建软链接########
ln -s /application/mysql-5.5.32/ /application/mysql
#####拷贝配置文件及启动文件#########
/bin/cp /application/tools/mysql-5.5.32/support-files/my-small.cnf /etc/my.cnf
cp /application/tools/mysql-5.5.32/support-files/mysql.server /etc/init.d/mysqld
chmod 700 /etc/init.d/mysqld
#####初始化#######
chown -R mysql.mysql /application/mysql/data/
/application/mysql/scripts/mysql_install_db --basedir=/application/mysql/ --datadir=/application/mysql/data/ --user=mysql
#####环境变量######
echo ‘export PATH=/application/mysql/bin/:$PATH‘ >>/etc/profile
tail -1 /etc/profile
source /etc/profile
which mysql
配置mysql-master
①修改my.cnf配置文件,开启bin-log功能,修改server-id(这里的ID在主从或多从之间是唯一的)
vi /etc/my.cnf
[mysqld]
server-id = 1
log-bin=mysql-bin
###################
/etc/init.d/mysqld restart
②登录mysql,添加同步用户并检查
mysql> grant replication slave on *.* to ‘rep‘@‘192.168.1.%‘ identified by ‘123456‘;
mysql> show grants for ‘rep‘@‘192.168.1.%‘;
③锁表全备,备份完后解表
mysql> flush table with read lock;
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 396 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
mysql> system mysqldump -uroot -p‘123456‘ -A -B --events |gzip >/tmp/master.sql.gz
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 396 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
mysql> unlock table;
④将全备的数据拷贝到slave上。
[lee@mysql-master tmp]$ scp -P52113 master.sql.gz 192.168.1.12:~
Warning: Permanently added ‘[192.168.1.12]:52113‘ (RSA) to the list of known hosts.
lee@192.168.1.12‘s password:
master.sql.gz 100% 141KB 141.0KB/s 00:00
配置mysql-slave
①修改/etc/my.cnf配置文件的server-id
vi /etc/my.cnf
[mysqld]
server-id = 2
②将全备的数据导入到slave中
[root@mysql-slave lee]# gzip -d master.sql.gz
[root@mysql-slave lee]# mysql -uroot -p‘123456‘ </home/lee/master.sql
③登录mysql,配置同步参数
mysql> CHANGE MASTER TO
-> MASTER_HOST=‘192.168.1.11‘,
-> MASTER_PORT=3306,
-> MASTER_USER=‘rep‘,
-> MASTER_PASSWORD=‘123456‘,
-> MASTER_LOG_FILE=‘mysql-bin.000002‘,
-> MASTER_LOG_POS=396;
Query OK, 0 rows affected (0.09 sec)
注解:
CHANGE MASTER TO
MASTER_HOST=‘192.168.1.11‘, <==这里是主库的ip
MASTER_PORT=3306, <==这里是主库的端口,从库端口可以和主库不同。
MASTER_USER=‘rep‘, <==这里是主库上建立的用于复制的用户rep。
MASTER_PASSWORD=‘123456‘, <==这里是rep的密码。
MASTER_LOG_FILE=‘mysql-bin.000002‘, <==这里是show master status时看到的查看到的二进制日志文件名称,注意不能多空格。
MASTER_LOG_POS=396; <==这里是show master status时看到的查看到的二进制日志偏移量,注意不能多空格。
④开启主从同步开关,并查看状态
mysql> start slave;
mysql> show slave status\G
mysql> system mysql -uroot -p‘123456‘ -e "show slave status\G" |egrep "Slave_IO_Running:|Slave_SQL_Running:|Seconds_Behind_Master:"
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
两个yes和一个0,证明了配置已经成功了。
测试:
查看master和slave有哪些数据库
master:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)
mysql> system hostname
mysql-master
mysql>
slave:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)
mysql> system hostname
mysql-slave
在master端创建helloworld数据库,看slave端是否同步
master:
mysql> create database helloworld;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| helloworld |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql> system hostname
mysql-master
slave:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| helloworld |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql> system hostname
mysql-slave
OK,同步成功~~~~~~~
主从复制部署回顾:
1.准备两台数据库环境,或者单台多实例环境,能否正常启动和登录。
2.配置my.cnf文件,主库配置log-bin和server-id参数,从库配置server-id,不能和主库及其他从库一样,一般不开启log-bin功能。注意:配置参数后要重启生效。
3.登录主库增加用于从库连接主库同步的账号,例如:rep,并授权replication slave同步的权限。
4.登录主库,整库锁表flush table with read lock;然后show master status查看binlog的日志文件名和位置状态。
5.新开窗口,备份或导出原有的数据库数据,并拷贝到从库所在的服务器目录。(如果数据量很大,并且允许停机,可以停机打包,而不用mysqldump)
6.解锁主库,unlock tables;
7.把主库导出的原有数据恢复到从库。
8.根据主库的show master status查看binlog的位置状态,在从库执行change master to....语句。
9.从库开启同步开关,start slave。
10.从库show slave status\G,检查同步状态,并在主库进行更新测试。
本文出自 “Chocolee” 博客,请务必保留此出处http://chocolee.blog.51cto.com/8158455/1415173