Jump to navigation

You are currently browsing all posts tagged with 'mirror'

使用Mysql 的镜像功能进行数据同步

  • Posted on January 22, 2010 at 1:37 pm

数据库版本:5.1.24。

4.x版本的数据库请自己去找相应文档。

英文版文档的原文地址:http://dev.mysql.com/doc/refman/5.1/en/replication-howto.html

1 在主服务器(master)正常运行的情况下,创建一个专门用来同步数据的用户。

CREATE USER ‘用户名’@'从服务器IP’ IDENTIFIED BY ‘密码’;

GRANT REPLICATION SLAVE ON *.* TO ‘用户名’@'从服务器IP’;

这个用户名和密码(明文)以后会自动保存到从服务器上的master.info里面。

2 修改主服务器上面的my.cnf

[mysqld]

log-bin=mysql-bin

server-id=1

这个镜像系统中的每一台mysql主机都需要一个不同的server-id (1~2的32次方-1)

PS:如果使用了innodb, 还需要加上:

innodb_flush_log_at_trx_commit=1

sync_binlog=1

PS again:  主服务配置文件里面一定不能有 skip-networking

PS3: 主服务器防火墙开放3306端口给从服务器。

然后重新启动主服务器的mysqld,使配置生效。

3 获取主服务器状态信息并复制数据。

3.1 获取主服务器二进制日志的座标

在主服务器上运行一个mysql客户端,

mysql> FLUSH TABLES WITH READ LOCK;

这会flush所有的数据表,并且阻塞所有的写入操作。

对于innodb类型的表,COMMIT 语句也会阻塞。

不要退出这个mysql客户端,否则这个read lock会失效。

在主服务器上重新打开一个mysql客户端,

mysql > SHOW MASTER STATUS;

+—————+———-+————–+——————+

| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+—————+———-+————–+——————+

| mysql-bin.003 | 73       | test         | manual,mysql     |

+—————+———-+————–+——————+

File 字段显示的是二进制日志的文件名

Position 显示的是此文件中的偏移量。 抄下来这二个数据。

They represent the replication coordinates at which the slave should begin processing new updates from the master.

3.2复制数据

3.2.1 使用mysqldump

适用于数据量比较小的情况。

注意唉,现在主数据库还处于只读状态,阻塞着所有的写入操作呢,也就是说你的网站处于瘫痪状态呢。如果数据库的数据量太大,dump时间过长,有得你受的。

Shell下面执行 mysqldump –all-databases –lock-all-tables >dbdump.db

然后在FLUSH TABLES WITH READ LOCK;的那个mysql客户端里面运行:

UNLOCK  TABLES;

这时,主服务器的业务恢复正常。

可以把dbdump.db复制到所有的从服务器上面了。

3.2.2 直接复制数据库文件。

适用于myisam数据量比较大的情况。

PS:使用了完全cache型的数据表可能会丢失数据。比如memory类型的表。

PS2:如果你的表使用了全文索引(full-text indexes),并且主从服务器上面的 ft_stopword_file, ft_min_word_len, ft_max_word_len  变量的值不相同的话,可能会出问题。

关闭主数据库mysqladmin shutdown,

使用cp tar 或者rsync scp等来复制数据文件(不包括日志文件,不包括mysql库的数据文件)。

开启mysqld服务。

4 关闭从数据库,并且修改从数据库上面的my.cnf

[mysqld]

server-id=2

就是这么简单。 Server-id不要和其它服务器冲突就行了。

PS:从服务器上面是否开启二进制日志都无所谓。个人建议开了好,方便数据恢复。

PS2: 不要启动从数据库。

5 从数据库导入数据。

5.1 如果数据是以mysqldump方式导出的:

使用 –skip-slave-start  –replicate-ignore-db=mysql参数启动从数据库 。

然后用 mysql –uroot –p < fulldb.dump  导入。

5.2 如果是直接复制的数据文件:

把文件复制到从服务器正确的位置。

然后使用 –skip-slave-start  –replicate-ignore-db=mysql参数启动从数据库。

6 在从数据库上配置镜像信息:

mysql> CHANGE MASTER TO MASTER_HOST=’master_host_name’, MASTER_USER=’replication_user_name’, MASTER_PASSWORD=’replication_password’, MASTER_LOG_FILE=’recorded_log_file_name’, MASTER_LOG_POS=recorded_log_position;

注: master_host_name 为主服务器IP

replication_user_name 为第一步时候我们创建的用户名

replication_password 为第一步时候我们创建的密码

recorded_log_file_name 为第三步时候SHOW MASTER STATUS 获得的File字段。

recorded_log_position 为第三步时候 SHOW MASTER STATUS 获得到的Position字段。

7  在从数据库上开启镜像功能:

Mysql> start slave;

基本上这条语句是不会报错的,请查看从数据库的日志。

一旦从数据库开始进行数据同步,就会在从服务器上面生成二个文件:

master.info  和  relay-log.info

不要修改或删除这二个文件。看看是可以的。

8 重复4-7步,添加多台从服务器。

9 对于每一台从服务器,mysqld重启的话,都要加上  –replicate-ignore-db=mysql 参数,表示不同步mysql这个库。如果你有多个库需要忽略,那么就重复写这个参数。不要试图用逗号分隔多个库名,没用的。

mysql> SHOW BINARY LOGS;

+—————+———–+

| Log_name      | File_size |

+—————+———–+

| binlog.000015 |    724935 |

| binlog.000016 |    733481 |

+—————+———–+

show master logs 与 show binary logs 功能相同。

SHOW BINLOG EVENTS

[IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]

显示二进制日志里面发生的事情

mysql> SHOW MASTER STATUS;

+—————+———-+————–+——————+

| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+—————+———-+————–+——————+

| mysql-bin.003 | 73       | test         | manual,mysql     |

+—————+———-+————–+——————+

mysql> SHOW SLAVE HOSTS;

+————+———–+——+———–+

| Server_id  | Host      | Port | Master_id |

+————+———–+——+———–+

|  192168010 | iconnect2 | 3306 | 192168011 |

| 1921680101 | athena    | 3306 | 192168011 |

+————+———–+——+———–+

只有从服务器启动的时候加了 –report-host=host_name 参数,才会显示在这里。

mysql> SHOW SLAVE STATUS\G

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: localhost

Master_User: root

Master_Port: 3306

Connect_Retry: 3

Master_Log_File: gbichot-bin.005

Read_Master_Log_Pos: 79

Relay_Log_File: gbichot-relay-bin.005

Relay_Log_Pos: 548

……

Top