说明:
本文主要讲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 = 1log-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.203identifiedby '123456';
>quit

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

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

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

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

>flush tableswithreadlock;
# 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.cnfserver-id= 10  //我只修改了这条,其它都是在mysql命令行修改。所以下面的都不需要master-host= 192.168.45.7master-user=slave
master
-password= 123456master-port= 3306master-connect-retry = 5replicate-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        |
+——————-+
2rowsin set (0.00sec)

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服务器插入一条数据

> usemyslave;
>insertintousers(username,website)values('edison','http://www.gaingreat.com');

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

附录:
1.查看从mysql状态

>show slave statusG;
Waiting for master to sendevent
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 读写分离

转载请注明:酷喃|coolnull| » mysql主从同步备份