| 您的当前位置:首页 --> MYSQL教程 --> MySQL主从复制的原理及配置方法(比较详细) |
| MYSQL教程 MySQL主从复制的原理及配置方法(比较详细) |
| 浏览次数:976 关键词 ( ) |
| 查看使用该CPU的产品 查看CPU天梯 |
| CPU型号:MySQL主从复制的原理及配置方法(比较详细) |
| 主频:Ghz |
| 睿频:Ghz |
| 核心数:个 |
| 不支持超核心 |
| 制作工艺: |
| 插槽类型: |
| 功耗:0W |
| L3缓存:0MB |
| 支持最大内存: 0GB |
| CPU详细参数 |
|
一、复制的原理 MySQL 复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以便从服务器可以对其数据拷贝执行相同的更新。 将主服务器的数据拷贝到从服务器的一个途径是使用LOAD DATA FROM MASTER语句。请注意LOAD DATA FROM MASTER目前只在所有表使用MyISAM存储引擎的主服务器上工作。并且,该语句将获得全局读锁定。 MySQL 使用3个线程来执行复制功能,其中1个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。 二、复制线程的状态 1.复制主线程的状态 复制代码 代码如下: Sending binlog event to slave 二进制日志由各种事件组成,一个事件通常为一个更新加一些其它信息。线程已经从二进制日志读取了一个事件并且正将它发送到从服务器。 Finished reading one binlog; switching to next binlog 线程已经读完二进制日志文件并且正打开下一个要发送到从服务器的日志文件。 Has sent all binlog to slave; waiting for binlog to be updated 线程已经从二进制日志读取所有主要的更新并已经发送到了从服务器。线程现在正空闲,等待由主服务器上新的更新导致的出现在二进制日志中的新事件。 Waiting to finalize termination 线程停止时发生的一个很简单的状态。 2.复制从I/O线程状态 复制代码 代码如下: Connecting to master
线程正试图连接主服务器。 Checking master version Registering slave on master Requesting binlog dump Waiting to reconnect after a failed binlog dump request Reconnecting after a failed binlog dump request Waiting for master to send event Queueing master event to the relay log Waiting to reconnect after a failed master event read Reconnecting after a failed master event read Waiting for the slave SQL thread to free enough relay log space Waiting for slave mutex on exit 3.复制从SQL线程状态 复制代码 代码如下: Reading event from the relay log 线程已经从中继日志读取一个事件,可以对事件进行处理了。 Has read all relay log; waiting for the slave I/O thread to update it Waiting for slave mutex on exit 三、复制传递和状态文件 从服务器靠中继日志来接收从主服务器上传回来的日志。并依靠状态文件来记录已经从主服务器接收了哪些日志,已经恢复了哪些日志。 中继日志与二进制日志的格式相同,并且可以用mysqlbinlog读取。SQL线程执行完中继日志中的所有事件并且不再需要之后,立即自动删除它。可以采用–relay-log和–relay-log-index服务器选项覆盖默认中继日志和索引文件名。其中索引文件名的作用是记录目前正在使用中继日志。 在下面的条件下将创建新的中继日志: 复制代码 代码如下: 行 描述
1 文件中的行号 2 Master_Log_File 3 Read_Master_Log_Pos 4 Master_Host 5 Master_User 6 密码(不由SHOW SLAVE STATUS显示) 7 Master_Port 8 Connect_Retry 9 Master_SSL_Allowed 10 Master_SSL_CA_File 11 Master_SSL_CA_Path 12 Master_SSL_Cert 13 Master_SSL_Cipher 14 Master_SSL_Key relay-log.info文件: 复制代码 代码如下: 行 描述
1 Relay_Log_File 2 Relay_Log_Pos 3 Relay_Master_Log_File 4 Exec_Master_Log_Pos 当备份从服务器的数据时,你还应备份这两个小文件以及中继日志文件。它们用来在恢复从服务器的数据后继续进行复制。如果丢失了中继日志但仍然有 relay-log.info文件,你可以通过检查该文件来确定SQL线程已经执行的主服务器中二进制日志的程度。然后可以用 Master_Log_File和Master_LOG_POS选项执行CHANGE MASTER TO来告诉从服务器重新从该点读取二进制日志。当然,要求二进制日志仍然在主服务器上。所以最好建议将自动删除中继日志的特性关闭,手工写shell角本来防止空间满的问题。 四、复制的配置步骤 1.创建专门用于复制的用户(建议这样做),从服务器采用该帐户登陆主服务器: 复制代码 代码如下: GRANT REPLICATION SLAVE ON *.* TO 'rep'@'%' IDENTIFIED BY 'logzgh' ; 如果你计划从从属服务器主机使用LOAD TABLE FROM MASTER或LOAD DATA FROM MASTER语句,你需要授予该账户其它权限: 授予账户SUPER和RELOAD全局权限。 为所有想要装载的表授予SELECT权限。任何该 账户不能SELECT的主服务器上的表被LOAD DATA FROM MASTER忽略掉。 2.将数据库文件移到从服务器上 复制代码 代码如下: mysql> FLUSH TABLES WITH READ LOCK; (刷新所有表并且阻止其它写入,不要退出该客户端,以保持读锁有效。若退出,读锁就会释放。) 比较简单的办法就是把数据目录打包压缩。 复制代码 代码如下: $ tar -cvf /home/mysql/snapshot.tar ./data (在master上)
$ tar -xvf /home/mysql/snapshot.tar (在slave上) 可能不需要同步 mysql 数据库,因为在slave上的权限表和master不一样。这时,解开压缩包的时候要排除它。 复制代码 代码如下: mysql> SHOW MASTER STATUS;
+——————+———-+————–+——————+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +——————+———-+————–+——————+ | mysql-bin.000058 | 45036137 | | | +——————+———-+————–+——————+ mysql> UNLOCK TABLES; 情况二:若用到InnoDB表 复制代码 代码如下: mysql> FLUSH TABLES WITH READ LOCK; mysql> SHOW MASTER STATUS; 尽快记下显示结果中的日志文件及偏移位置。然后,在不解锁的情况下关闭master,确保master上的快照和记录的结果一致。 关闭master服务器,$ mysqladmin -u root shutdown 拷贝 InnoDB 数据文件,日志文件,以及表结构定义文件(.frm文件)。 情况三:可以同时用于MyISAM和InnoDB表 在master上做SQL转储而无需如上所述备份二进制日志。运行mysqldump –master-data命令,然后把结果文件转储到slave上。 不过,这比拷贝二进制日志慢点。 3.修改my.cnf文件 复制代码 代码如下: [mysqld] log_bin server_id=1 (值是 1 到 2^32-1 之间的正整数) 在slave上my.cnf文件: 复制代码 代码如下: [mysqld]
server_id=2 (ID必须和master的ID不同。若有多个slave,则每个slave都必须有唯一的id。) 配置slave的扩展选项 复制代码 代码如下: master_host=db-master.mycompany.com
master_port=3306 master_user=rep master_password=freitag master_connect_retry=60 (若master宕机或者slave连接断开,slave会定期尝试连接到master上,重试的间隔由该选项来控制,默认值是60秒。) report_host=db-slave.mycompany.com slave_net_timeout=3600 (slave默认会在3600秒后,若还没收到来自master的数据,则会当作网络断开的情况来处理。) 服务器认为master.info的优先级比配置文件my.cnf高, 复制代码 代码如下: mysqld_safe –user=mysql –skip-slave-start & (启动MySQL服务器,但不启动slave) 设置master_log_file等参数 mysql> CHANGE MASTER TO MASTER_HOST='qa-sandbox-1′, MASTER_USER='rep', MASTER_PASSWORD='logzgh', MASTER_LOG_FILE='mysql-bin.000007′, MASTER_LOG_POS=471632; mysql> START SLAVE; 执行这些程序后,从服务器应连接主服务器,并补充自从快照以来发生的任何更新。 如果你忘记设置主服务器的server-id值,从服务器不能连接主服务器。 注释:为了保证事务InnoDB复制设置的最大可能的耐受性和一致性, 复制代码 代码如下: mysql> show variables; (检查是否read-only,该选项令slave除了slave线程或者拥有SUPER权限用户之外的都不能更新数据,确保slave不会接受来自其他客户端的更新。) mysql> show processlist; (检查是否slave-start) 在启动mysql的同时启动slave: 复制代码 代码如下: mysqld_safe –user=mysql –read-only & (启动MySQL服务器,同时启动slave的I/O线程)
mysql> SHOW SLAVE STATUSG; 5.切换slave为master,在slave上: 复制代码 代码如下: mysql> STOP SLAVE; mysql> RESET MASTER; 五.复制启动选项 –read_only –replicate_do_db=db_name –replicate_do_table=db_name.tbl_name –replicate_ignore_db=db_name –replicate-ignore-table=db_name.tbl_name –replicate_wild_do_table=db_name.tbl_name –replicate_wild_ignore_table=db_name.tbl_name –replicate_rewrite_db=from_name->to_name –report_host=slave_name –report_port=slave_port –skip_slave_start –slave_skip_errors=[err_code1,err_code2,… | all] 六、不停机配置复制的方法 方法一: 1. 确保从服务器分配了一个唯一的服务器ID号。 复制代码 代码如下: mysql> CHANGE MASTER TO
-> MASTER_HOST='master_host_name', -> MASTER_USER='master_user_name', -> MASTER_PASSWORD='master_pass', -> MASTER_LOG_FILE='recorded_log_file_name', -> MASTER_LOG_POS=recorded_log_position; 4.在从服务器上执行START SLAVE语句。 如果你没有备份主服务器,这里是一个创建备份的快速程序。所有步骤都应该在主服务器主机上执行。 1. 发出该语句: 复制代码 代码如下: mysql> FLUSH TABLES WITH READ LOCK; 2. 仍然加锁时,执行该命令(或它的变体): 复制代码 代码如下: shell> tar zcf /tmp/backup.tar.gz /var/lib/mysql 并拷到从服务器上。 3. 发出该语句并且确保记录了以后用到的输出: 复制代码 代码如下: mysql>SHOW MASTER STATUS; 4. 释放锁: 复制代码 代码如下: mysql> UNLOCK TABLES;
方法二: 一个可选择的方法是,转储主服务器的SQL来代替前面步骤中的二进制复制。要这样做,你可以在主服务器上使用mysqldump –master-data,以后装载SQL转储到到你的从服务器。然而,这比进行二进制复制速度慢。 七、其他 1.不能从使用新二进制日志格式的主服务器向使用旧二进制日志格式的从服务器复制。 3.必须在主服务器和从服务器上总是使用相同的全局字符集和校对规则(–default-character-set、–default- collation)。否则,会在从服务器上遇到复制键值错误,因为在主服务器的字符集中被认为是唯一的键值在从服务器的字符集中可能不是唯一的。 5.Q:我怎样知道从服务器与主服务器的最新比较? 换句话说,我怎样知道从服务器复制的最后一个查询的日期? 6. Q:我怎样强制主服务器阻塞更新直到从服务器同步? 复制代码 代码如下: mysql> FLUSH TABLES WITH READ LOCK; mysql> SHOW MASTER STATUS; 记录SHOW语句的输出的日志名和偏移量。这些是复制坐标。 2.在从服务器上,发出下面的语句,其中Master_POS_WAIT()函数的参量是前面步骤中的得到的复制坐标值: 3.在主服务器上,发出下面的语句允许主服务器重新开始处理更新: 复制代码 代码如下: mysql> UNLOCK TABLES;
7.Q:怎样通过复制来提高系统的性能? |
| 下一个产品 SQL计算timestamp的差值的方法 上一个产品 MySQL存储引擎简介及MyISAM和InnoDB的区别 |