关于MySQL主从复制的简单介绍
MySQL复制是一个过程,它允许您自动从主数据库复制到从数据库来轻松维护MySQL数据的多个副本。这有多种原因,包括为数据提供备份,单独分析数据而不使用主数据库,或仅仅作为扩展的手段,又或者是实现mysql数据库读写分离,以减轻数据库的读写压力。
本教程将介绍mysql主从复制的一个非常简单的例子 - 一个主机会将信息发送给一个从机,要使这个过程起作用,您需要两个IP地址:一个主服务器和一个从服务器。
本教程将使用以下IP地址:
12.34.56.789 - 主数据库IP
12.23.34.456 - 从属数据库IP
建立
本文假定您的用户具有sudo管理权限并在主从服务器中安装了MySQL,如果你没有mysql,你可以使用下面的命令安装它:
sudo apt-get install mysql-server mysql-client
第一步 - 配置Master主数据库
使用vim命令打开并编辑主服务器上的mysql配置文件,如下:
sudo vim /etc/mysql/my.cnf
我们需要对my.cnf配置文件进行一些修改,你的my.cnf可能不在/etc/mysql文件夹下,看你自己的情况哦!
第一步我们就是要绑定主服务器IP,这样就可以以后用第三方工具或在别的服务器可以直接登录主服务器了,如下:
bind-address = 127.0.0.1
将默认的IP改成我们主服务器的IP地址,代码如下:
bind-address = 12.34.56.789
接着更改位于[mysqld]部分中的服务器标识,您可以为它设置任何数字(从1开始可能会更容易),但该数字必须是唯一的,并且不能与复制组中(从数据库等)的其他服务器ID相同,小编设置的是数字“1”。
确保这一行没有被注释。
server-id = 1
找到log_bin这一行,它记录了数据库所有的操作记录,作用应该不用我说,确保这是真实存在的位置,对于这一步,我们只需要取消注释的log_bin这行:
log_bin = /var/log/mysql/mysql-bin.log
最后我们需要指定将会在从服务器上复制的数据库,如果有多个数据库需要复制,你可以添加多行,指定不同的数据库。
binlog_do_db = newdatabase
最后ESC保存退出my.cnf的编辑状态,如下:
wq!
下一步,我们打开MySQL shell
mysql -u root -p
我们给主数据库设置权限,允许从slave服务器的用户通过“slave_user”用户名和“password”的密码登录我们的master主数据库。
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password';
刷新权限
FLUSH PRIVILEGES;
重启Mysql数据库,命令如下:
sudo service mysql restart //Centos 7是这样重启mysql的 systemctl restart mysqld
接着我们可以重新登录,进入到MySQL shell,运行如下命令选择我们的数据库:
USE newdatabase;
锁定数据库,以防止任何更改,为后面的内容导出做准备,命令如下:
FLUSH TABLES WITH READ LOCK;
然后键入如下命令:
SHOW MASTER STATUS;
你将会看到如下信息,这些信息很重要!
mysql> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 107 | newdatabase | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
说明:
“Position”107记录的是数据库当前的位置,非常重要!slave从表在复制master主数据库的时候,就会从这个位置开始复制,因为要mysql主从复制的话,这两个数据库服务器的内容当然就应该要一样了。
“mysql-bin.000001”是mysql日志信息,在同步主从数据时有用到,所以也要记录起来,
为了防止在同一窗口中有操作导致数据的更改,而造成院线的锁被解除,导致position发生变化,所以最好用别的工具启动另外一个MySQL shell,然后将主服务器的数据库导出,后面要用到,使用如下命令:
mysqldump -u root -p --opt newdatabase > newdatabase.sql
解除锁状态,让其数据库具有可写状态,在Mysql shell中运行如下命令,
UNLOCK TABLES;
QUIT;
第二步 - 配置Slave从数据库
进入到从服务器,然后“mysql -uroot -p”登陆到从数据库,创建你将要在主数据复制的“newdatabase”数据库。
CREATE DATABASE newdatabase;
EXIT;
导入主数据库的所有数据,前面已经导出的newdatabase.sql文件,命令如下:
mysql -u root -p newdatabase < /path/to/newdatabase.sql
我们对从数据库进行配置,修改my.cnf文件,和我们之前的配置差不多,如下:
sudo vim /etc/mysql/my.cnf
在[mysqld]部分修改服务器标识,这里改成2,以免和前面的重复,如下:
server-id = 2
添加如下的三个配置,需要添加relay-log行,默认是不存在的,用于记录数据库日志信息,如下:
relay-log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = newdatabase
重启mysql服务器,命令和上面一样,如下:
sudo service mysql restart //Centos 7是这样重启mysql的 systemctl restart mysqld
重新进入Mysql shell,前面已经介绍到。
并运行如下命令,它是用于连接主数据库服务器的,position位置信息是前面记录的“107”,日志记录文件是“mysql-bin.000001”,用户名和密码是Master主服务器的登录用户名与密码,如下:
CHANGE MASTER TO MASTER_HOST='12.34.56.789',MASTER_USER='slave_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 107;
激活从服务器,如下:
START SLAVE;
显示从服务器的详细信息,\G可以让信息看得更清晰,如下:
SHOW SLAVE STATUS\G
如果连接遇到问题,你可以使用如下命令启动Slave跳过这些问题,如下所示:
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; SLAVE START;
完毕!