MySQL复制的概述、安装、故障、技巧、工具
4424 点击·0 回帖
![]() | ![]() | ||||||
![]() | 同MongoDB,Redis这样的NoSQL数据库的复制相比,MySQL复制显得相当复杂! 概述 首先主服务器把数据变化记录到主日志,然后从服务器通过I/O线程读取主服务器上的主日志,并且把它写入到从服务器的中继日志中,接着SQL线程读取中继日志,并且在从服务器上重放,从而实现MySQL复制。具体如下图所示: 图片:64_3710_d38c3759827dfa2.png ![]() MySQL复制 整个过程反映到从服务器上,对应三套日志信息,可在从服务器上用如下命令查看:[table=95%][tr][td]mysql> SHOW SLAVE STATUS; [/td][/tr][/table]Master_Log_File ; Read_Master_Log_Pos:下一个传输的主日志信息。 Relay_Master_Log_File ; Exec_Master_Log_Pos:下一个执行的主日志信息。 Relay_Log_File ; Relay_Log_Pos:下一个执行的中继日志信息。 理解这些日志信息的含义对于解决故障至关重要,后文会详细阐述。 安装 先在主服务器上创建复制账号: [table=95%][tr][td]mysql> GRANT REPLICATION SLAVE ON *.* TO '<SLAVE_USER>'@'<SLAVE_HOST>' IDENTIFIED BY '<SLAVE_PASSWORD>'; [/td][/tr][/table]注:出于安全性和灵活性的考虑,不要把root等具有SUPER权限用户作为复制账号。 然后设置主服务器配置文件(缺省:/etc/my.cnf): [table=95%][tr][td][mysqld] server_id = 100 log_bin = mysql-bin log_bin_index = mysql-bin.index sync_binlog = 1 innodb_flush_log_at_trx_commit = 1 innodb_support_xa = 1 [/td][/tr][/table]注:一定要保证主从服务器各自的server_id唯一,避免冲突。 注:如果没有指定log_bin的话,缺省会使用主机名作为名字,如此一来一旦主机名发生改变,就会出问题,所以推荐指定log_bin(从服务器的relay_log存在一样的问题)。 注:sync_binlog,innodb_flush_log_at_trx_commit,innodb_support_xa三个选项都是出于安全目的设置的,不是复制的必须选项。 接着设置从服务器配置文件(缺省:/etc/my.cnf):
注:有了skip_slave_start,除非使用START SLAVE命令,否则从服务器不会开始复制。 注:设置log_slave_updates,让从服务器记录日志,有助于在必要时把从切换成主。 下面最重要的步骤是如何克隆一份主服务器的数据: 如果数据库使用的是MyISAM表类型的话,可按如下方式操作:
如果数据库使用的是InnoDB表类型的话,则应该使用single-transcation:
在拷贝之前要先锁定数据,然后再获得相关的日志信息(FILE ; POSITION):
| ||||||
![]() | ![]() |