Think before you speak, read before you think.

mysql主从复制

大致思路:设置master端,用于复制的账户,锁表导入数据库,在slave中导入数据库,设置slave端

mysql主从复制是一种比较靠谱的备份方式,这里用最简单的,一个master,一个slave

12.34.56.789- Master Database

12.23.34.456- Slave Database

前提条件:

主从数据库大版本要一样,可以用mysql -V查看,我这里用的是mysql  Ver 14.14 Distrib 5.5.31

设置master端

配置文件vim /etc/mysql/my.cnf,mysql的bind-address只能绑一个特定的ip或0.0.0.0,我现在用的是0.0.0.0,即

bind-address            = 0.0.0.0

在 [mysqld]段下为server-id设置一个独立的编号

server-id               = 1

主从复制需要binary的log日志,将log_bin这一行取消注释

log_bin                 = /var/log/mysql/mysql-bin.log

设置要复制的数据库jpuyydb

binlog_do_db            = jpuyydb

master的配置文件设置完了,重启mysql

/etc/init.d/mysql restart

接下来在mysql中操作,mysql -u root -p,添加一个复制用的账户slave_user密码是password,这里的权限是可以复制所有数据库

GRANT select, replication client, replication slave *.* TO 'slave_user'@'%' IDENTIFIED BY 'password';

刷新权限

FLUSH PRIVILEGES;

接下来的操作需要按步骤操作,将jpuyydb锁表,防止有其他操作影响当前状态

use jpuyydb;
flush tables with read lock;

接下来查看master状态,并将下面的值file和position记录下来

mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 107 | jpuyydb | test |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

如果在当前的界面有一些操作的话,数据库的表会自动解锁,所以新开一个窗口,将数据库备份下来,

mysqldump -u root -p --opt jpuyydb > jpuyydb.sql

然后在原窗口解锁,退出,master端就设置好了

UNLOCK TABLES;
QUIT;

在slave中创建并导入数据库,

在mysql中创建数据库

create database if not exists jpuyydb default charset utf8 collate utf8_general_ci;

导入数据库

mysql -u root -p jpuyydb < jpuyydb.sql

设置slave端,vim /etc/mysql/my.cnf,需要修改的如下

server-id               = 100

添加一条relay-log

relay-log               = /var/log/mysql/mysql-relay-bin.log
log_bin                 = /var/log/mysql/mysql-bin.log
binlog_do_db            = jpuyydb

修改好之后退出,重启mysql,之后进入mysql控制界面,运行

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;

现在slave设置好了,启动slave

START SLAVE;

查看slave的状态,\G将输出以适合阅读的方式显示出来

SHOW SLAVE STATUS\G

如果下面两条都是Yes表示成功

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Trouble Shooting:

如果一直是连接状态,需要做如下排查,

在slave端尝试连接master

mysql -u slave_user -p -P 3306 -h 12.34.56.789

在master端查看3306的连接情况,应该有一条类似于下面的ESTABLISHED的记录

lsof -i tcp:3306
mysqld  10310 mysql   15u  IPv4 7636301      0t0  TCP ip-10-128-.internal:mysql->112.65.13.1s:55781 (ESTABLISHED)

在slave端如果一直是connecting状态,则尝试如下操作

SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; SLAVE START;

在slave端出现如下错误时

ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log

解决方法一:

进入到/var/lib/mysql/删掉

master.info
relay-log.info

解决方法二:

mysql> flush slave;

Query OK, 0 rows affected (0.00 sec)

mysql> reset slave;
Query OK, 0 rows affected (0.00 sec)

参考:

https://www.digitalocean.com/community/articles/how-to-set-up-master-slave-replication-in-mysql


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *