mysql主从同步备份

说明:
本文主要讲mysql主从数据同步,从mysql实时同步主mysql的数据。这里,一般要求主msyql与从mysql版本相同或主msyql不高于从mysql版本(版本查询>select version())。一般稳健的做法都是使其版本相同,因为不同mysql版本之间的binlog(二进制日志)格式可能不一样,有可能会导致同步异常。

主mysql: 192.168.1.202
从mysql: 192.168.1.203

实现:
一.配置主mysql
1.修改主mysql配置,注意这里主mysql与从mysql server-id一定不能相同

# vim /etc/mysql/my.cnf  //内容如下
server-id = 1
log-bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10     //设置binlog超期日期
max_binlog_size = 100M   //不一定要,设置单个binlog最大文件大小
binlog_do_db = myslave //需要同步多个数据库,请另起一行设置binlog_do_db = 同步数据库名称
binlog_ignore_db = mysql   //不同步数据库

 
2.重启主mysql,使配置生效

# /etc/init.d/mysql restart

 
3.主mysql中给予从mysql REPLICATION SLAVE权限即可,192.168.1.203为从库ip

> grant replication slave on *.* to slave@192.168.1.203 identified by '123456';
> quit

 
4.主mysql新建myslave数据库及表结构,用于测试。

# /usr/local/mysql/bin/mysql -u root -p -S /tmp/mysql.sock
> CREATE DATABASE myslave CHARSET 'utf8';
> use myslave;
> CREATE TABLE `users` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL,
`website` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

> CREATE TABLE `users_log` (
`user_log_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`info` varchar(200) DEFAULT NULL,
`uid` mediumint(8) unsigned NOT NULL,
PRIMARY KEY (`user_log_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

 
5.主mysql导出myslave数据库,先锁住myslave不让其有写入操作,这个窗口不要关,否则lock会失效

> flush tables with read lock;
# mysqldump -uroot -proot -P3306 --databases myslave > /tmp/backdb.sql  //导出单个数据库时
# mysqldump -uroot -proot -P3306 --databases db1 db2 > /tmp/backdb.sql  //导出多个数据库时
> unlock tables  //导出成功后,解锁表

 
6.新开个终端,进入mysql查看binlog的File,Position,记下,很重要!

# /usr/local/mysql/bin/mysql -u root -p -S /tmp/mysql.sock
> show master status;
+——————+———-+————–+——————+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000001 |      106 | myslave      | mysql            |
+——————+———-+————–+——————+

 
二.从mysql操作,修改my.cnf
1.修改从mysql配置文件/etc/my.cnf

# vim /etc/mysql/my.cnf
server-id       = 10  //我只修改了这条,其它都是在mysql命令行修改。所以下面的都不需要
master-host     = 192.168.45.7
master-user     = slave
master-password = 123456
master-port     = 3306
master-connect-retry    = 5
replicate-do-db = myslave
replicate-ignore-db     = mysql

 
2.修改完my.cnf重启mysql,使配置生效

# /etc/init.d/mysql restart

 
3.导入主mysql dump出的数据。可能需要先使用create database 库,新建库,具体没注意。

# /usr/local/mysql/bin/mysql -u root -p -S /tmp/mysql.sock
> source /tmp/backdb.sql  //个人理解,如果多个库在同一个mysqldump文件中,要同时导入所有库,就不用> use 库,直接source /tmp/backdb.sql。如果要导入多个库,但不是全部,可能得> use db1,> source /tmp/backdb.sql;> use db2,> source /tmp/backdb.sql

 
4.查看是否导入成功

> show tables;
+——————-+
| Tables_in_myslave |
+——————-+
| users             |
| users_log         |
+——————-+
2 rows in set (0.00 sec)

 
5.配置Slave信息并启动Slave服务,修改master前要先停slave服务

> stop slave  //默认是关闭
> CHANGE MASTER TO
> MASTER_HOST='192.168.1.100',
> MASTER_USER='slave',
> MASTER_PORT=3306,     //注意不要引号
> MASTER_PASSWORD='123456',
> MASTER_LOG_FILE='mysql-bin.000004',
> MASTER_LOG_POS=106;   //注意不要引号

以上关键的是MASTER_LOG_FILE以及MASTER_LOG_POS值,可以从Master服务器获得,如果不设置,将无法正常启动Slave服务

6.启动Slave服务

> start slave;
> show slave status/G;

当输入命令后会出现一大堆的状态,具体看Slave_IO_Running以及Slave_SQL_Running的状态,如果都是Yes就代表正常
然后还可以看到Slave_IO_State的状态是Waiting for master to send event,含义是等待Master服务器发送事件

三.测试:,在Master服务器插入一条数据

> use myslave;
> insert into users(username,website) values('edison','http://www.gaingreat.com');

插入成功之后,稍等片刻,就可以在Slave服务器上查看到相同记录,主从同步有时延

附录:
1.查看从mysql状态

>show slave statusG;
Waiting for master to send event
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

以上二行同时为Yes说明配置成功

2.查看主mysql状态

>show master status;

 

3.如果想要查看当前Slave服务器的同步状态及偏移值等信息,请查找master.info文件

more /var/lib/mysql/master.info

 

4.查看Slave执行binlog文件的情况

#more /var/lib/mysql/relay-log.info

 

原文参考:
MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践
MySQL数据库的同步配置+MySql 读写分离

发表评论

邮箱地址不会被公开。 必填项已用*标注