Home >Database >Mysql Tutorial >MySQL复制的概述、安装、故障、技巧、工具_MySQL

MySQL复制的概述、安装、故障、技巧、工具_MySQL

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOriginal
2016-06-01 14:02:09864browse

mysql管理工具mysql安装

MongoDBRedis这样的NoSQL数据库的复制相比,MySQL复制显得相当复杂!

概述

首先主服务器把数据变化记录到主日志,然后从服务器通过I/O线程读取主服务器上的主日志,并且把它写入到从服务器的中继日志中,接着SQL线程读取中继日志,并且在从服务器上重放,从而实现MySQL复制。具体如下图所示:

MySQL复制

MySQL复制

整个过程反映到从服务器上,对应三套日志信息,可在从服务器上用如下命令查看:

<font face="NSimsun">mysql> SHOW SLAVE STATUS;</font>

Master_Log_File & Read_Master_Log_Pos:下一个传输的主日志信息。

Relay_Master_Log_File & Exec_Master_Log_Pos:下一个执行的主日志信息。

Relay_Log_File & Relay_Log_Pos:下一个执行的中继日志信息。

理解这些日志信息的含义对于解决故障至关重要,后文会详细阐述。

安装

先在主服务器上创建复制账号:

<font face="NSimsun">mysql> GRANT REPLICATION SLAVE ON *.*<br>       TO '<slave_user>'@'<slave_host>'<br>       IDENTIFIED BY '<slave_password>';</slave_password></slave_host></slave_user></font>

注:出于安全性和灵活性的考虑,不要把root等具有SUPER权限用户作为复制账号。

然后设置主服务器配置文件(缺省:/etc/my.cnf):

<font face="NSimsun">[mysqld]<br><br>server_id = 100<br>log_bin = mysql-bin<br>log_bin_index = mysql-bin.index<br>sync_binlog = 1<br>innodb_flush_log_at_trx_commit = 1<br>innodb_support_xa = 1</font>

注:一定要保证主从服务器各自的server_id唯一,避免冲突。

注:如果没有指定log_bin的话,缺省会使用主机名作为名字,如此一来一旦主机名发生改变,就会出问题,所以推荐指定log_bin(从服务器的relay_log存在一样的问题)。

注:sync_binloginnodb_flush_log_at_trx_commitinnodb_support_xa三个选项都是出于安全目的设置的,不是复制的必须选项。

接着设置从服务器配置文件(缺省:/etc/my.cnf):

<font face="NSimsun">[mysqld]<br><br>server_id = 200<br>log_bin = mysql-bin<br>log_bin_index = mysql-bin.index<br>relay_log = mysql-relay-bin<br>relay_log_index = mysql-relay-bin.index<br>read_only = 1<br>skip_slave_start = 1<br>log_slave_updates = 1</font>

注:如果用户有SUPER权限,则read_only无效。

注:有了skip_slave_start,除非使用START SLAVE命令,否则从服务器不会开始复制。

注:设置log_slave_updates,让从服务器记录日志,有助于在必要时把从切换成主。

下面最重要的步骤是如何克隆一份主服务器的数据:

如果数据库使用的是MyISAM表类型的话,可按如下方式操作:

<font face="NSimsun">shell> mysqldump --all-databases --master-data=1 > data.sql</font>

注:master-data选项缺省会打开lock-all-tables,并写入CHANGE MASTER TO语句。

如果数据库使用的是InnoDB表类型的话,则应该使用single-transcation

<font face="NSimsun">shell> mysqldump --all-databases --single-transaction --master-data=1 > data.sql</font>

有了数据文件,传输到从服务器上并导入:

<font face="NSimsun">shell> mysql </font>

如果数据量很大的话,mysqldump会非常慢,此时直接拷贝数据文件能节省不少时间:

在拷贝之前要先锁定数据,然后再获得相关的日志信息(FILE & POSITION):

<font face="NSimsun">mysql> FLUSH TABLES WITH READ LOCK;</font>

<font face="NSimsun">mysql> SHOW MASTER STATUS;</font>

接下来拷贝数据文件时,如果是MyISAM表类型的话,直接拷贝即可;如果是InnoDB表类型的话,一定要先停止MySQL服务再拷贝,否则拷贝文件可能无法使用。把拷贝的数据文件直接复制到从服务器的数据目录。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn