MYSQL数据库MySQL主从复制的原理及配置方法(比较详细)
《MYSQL数据库MySQL主从复制的原理及配置方法(比较详细)》要点: MYSQL入门一、复制的原理 MYSQL入门MySQL 复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等).每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以便从服务器可以对其数据拷贝执行相同的更新. MYSQL入门将主服务器的数据拷贝到从服务器的一个途径是使用LOAD DATA FROM MASTER语句.请注意LOAD DATA FROM MASTER目前只在所有表使用MyISAM存储引擎的主服务器上工作.并且,该语句将获得全局读锁定. MYSQL入门MySQL 使用3个线程来执行复制功能,其中1个在主服务器上,另两个在从服务器上.当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句. MYSQL入门二、复制线程的状态 MYSQL入门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 线程停止时发生的一个很简单的状态. MYSQL入门2.复制从I/O线程状态 线程正试图连接主服务器. MYSQL入门Checking master version MYSQL入门Registering slave on master MYSQL入门Requesting binlog dump MYSQL入门Waiting to reconnect after a failed binlog dump request MYSQL入门Reconnecting after a failed binlog dump request MYSQL入门Waiting for master to send event MYSQL入门Queueing master event to the relay log MYSQL入门Waiting to reconnect after a failed master event read MYSQL入门Reconnecting after a failed master event read MYSQL入门Waiting for the slave SQL thread to free enough relay log space MYSQL入门Waiting for slave mutex on exit MYSQL入门3.复制从SQL线程状态 Reading event from the relay log 线程已经从中继日志读取一个事件,可以对事件进行处理了. MYSQL入门Has read all relay log; waiting for the slave I/O thread to update it MYSQL入门Waiting for slave mutex on exit MYSQL入门三、复制传递和状态文件 MYSQL入门从服务器靠中继日志来接收从主服务器上传回来的日志.并依靠状态文件来记录已经从主服务器接收了哪些日志,已经恢复了哪些日志. MYSQL入门中继日志与二进制日志的格式相同,并且可以用mysqlbinlog读取.SQL线程执行完中继日志中的所有事件并且不再需要之后,立即自动删除它.可以采用Crelay-log和Crelay-log-index服务器选项覆盖默认中继日志和索引文件名.其中索引文件名的作用是记录目前正在使用中继日志. MYSQL入门在下面的条件下将创建新的中继日志: 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 MYSQL入门relay-log.info文件: 1 Relay_Log_File 2 Relay_Log_Pos 3 Relay_Master_Log_File 4 Exec_Master_Log_Pos MYSQL入门当备份从服务器的数据时,你还应备份这两个小文件以及中继日志文件.它们用来在恢复从服务器的数据后继续进行复制.如果丢失了中继日志但仍然有 relay-log.info文件,你可以通过检查该文件来确定SQL线程已经执行的主服务器中二进制日志的程度.然后可以用 Master_Log_File和Master_LOG_POS选项执行CHANGE MASTER TO来告诉从服务器重新从该点读取二进制日志.当然,要求二进制日志仍然在主服务器上.所以最好建议将自动删除中继日志的特性关闭,手工写shell角本来防止空间满的问题. MYSQL入门四、复制的配置步骤 MYSQL入门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忽略掉. MYSQL入门2.将数据库文件移到从服务器上 (刷新所有表并且阻止其它写入,不要退出该客户端,以保持读锁有效.若退出,读锁就会释放.) 比较简单的办法就是把数据目录打包压缩. 代码如下: $ tar -cvf /home/mysql/snapshot.tar ./data (在master上) $ tar -xvf /home/mysql/snapshot.tar (在slave上) MYSQL入门可能不需要同步 mysql 数据库,因为在slave上的权限表和master不一样.这时,解开压缩包的时候要排除它. +――――――+―――-+――――C+――――――+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +――――――+―――-+――――C+――――――+ | mysql-bin.000058 | 45036137 | | | +――――――+―――-+――――C+――――――+ MYSQL入门mysql> UNLOCK TABLES; MYSQL入门情况二:若用到InnoDB表 mysql> SHOW MASTER STATUS; 尽快记下显示结果中的日志文件及偏移位置.然后,在不解锁的情况下关闭master,确保master上的快照和记录的结果一致. 关闭master服务器,$ mysqladmin -u root shutdown 拷贝 InnoDB 数据文件,日志文件,以及表结构定义文件(.frm文件). 情况三:可以同时用于MyISAM和InnoDB表 在master上做SQL转储而无需如上所述备份二进制日志.运行mysqldump Cmaster-data命令,然后把结果文件转储到slave上. 不过,这比拷贝二进制日志慢点. MYSQL入门3.修改my.cnf文件 log_bin server_id=1 (值是 1 到 2^32-1 之间的正整数) 在slave上my.cnf文件: 代码如下: [mysqld] server_id=2 (ID必须和master的ID不同.若有多个slave,则每个slave都必须有唯一的id.) MYSQL入门配置slave的扩展选项 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的数据,则会当作网络断开的情况来处理.) MYSQL入门服务器认为master.info的优先级比配置文件my.cnf高, 设置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入门mysql> START SLAVE; 执行这些程序后,从服务器应连接主服务器,并补充自从快照以来发生的任何更新. 如果你忘记设置主服务器的server-id值,从服务器不能连接主服务器. MYSQL入门注释:为了保证事务InnoDB复制设置的最大可能的耐受性和一致性, mysql> show variables; (检查是否read-only,该选项令slave除了slave线程或者拥有SUPER权限用户之外的都不能更新数据,确保slave不会接受来自其他客户端的更新.) mysql> show processlist; (检查是否slave-start) MYSQL入门在启动mysql的同时启动slave: MYSQL入门mysql> SHOW SLAVE STATUSG; MYSQL入门5.切换slave为master,在slave上: mysql> RESET MASTER; 五.复制启动选项 MYSQL入门Cread_only MYSQL入门Creplicate_do_db=db_name MYSQL入门Creplicate_do_table=db_name.tbl_name MYSQL入门Creplicate_ignore_db=db_name MYSQL入门Creplicate-ignore-table=db_name.tbl_name MYSQL入门Creplicate_wild_do_table=db_name.tbl_name MYSQL入门Creplicate_wild_ignore_table=db_name.tbl_name MYSQL入门Creplicate_rewrite_db=from_name->to_name MYSQL入门Creport_host=slave_name MYSQL入门Creport_port=slave_port MYSQL入门Cskip_slave_start MYSQL入门Cslave_skip_errors=[err_code1,err_code2,… | all] MYSQL入门六、不停机配置复制的方法 MYSQL入门方法一: MYSQL入门1. 确保从服务器分配了一个唯一的服务器ID号. -> 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; MYSQL入门4.在从服务器上执行START SLAVE语句. MYSQL入门如果你没有备份主服务器,这里是一个创建备份的快速程序.所有步骤都应该在主服务器主机上执行. MYSQL入门1. 发出该语句: 2. 仍然加锁时,执行该命令(或它的变体): 代码如下: shell> tar zcf /tmp/backup.tar.gz /var/lib/mysql 并拷到从服务器上. 3. 发出该语句并且确保记录了以后用到的输出: 代码如下: mysql>SHOW MASTER STATUS; 4. 释放锁: 代码如下: mysql> UNLOCK TABLES; MYSQL入门方法二: MYSQL入门一个可选择的方法是,转储主服务器的SQL来代替前面步骤中的二进制复制.要这样做,你可以在主服务器上使用mysqldump Cmaster-data,以后装载SQL转储到到你的从服务器.然而,这比进行二进制复制速度慢. MYSQL入门七、其他 MYSQL入门1.不能从使用新二进制日志格式的主服务器向使用旧二进制日志格式的从服务器复制. MYSQL入门3.必须在主服务器和从服务器上总是使用相同的全局字符集和校对规则(Cdefault-character-set、Cdefault- collation).否则,会在从服务器上遇到复制键值错误,因为在主服务器的字符集中被认为是唯一的键值在从服务器的字符集中可能不是唯一的. MYSQL入门5.Q:我怎样知道从服务器与主服务器的最新比较? 换句话说,我怎样知道从服务器复制的最后一个查询的日期? MYSQL入门6. Q:我怎样强制主服务器阻塞更新直到从服务器同步? mysql> SHOW MASTER STATUS; 记录SHOW语句的输出的日志名和偏移量.这些是复制坐标. MYSQL入门2.在从服务器上,发出下面的语句,其中Master_POS_WAIT()函数的参量是前面步骤中的得到的复制坐标值: MYSQL入门3.在主服务器上,发出下面的语句允许主服务器重新开始处理更新: MYSQL入门7.Q:怎样通过复制来提高系统的性能? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- MySQL:如何将varchar(255)UNIQUE列更改为UNIQUE Text NOT
- Mysql实例MySQL 5.6 中TIMESTAMP with implicit DEFAULT va
- MYSQL教程MySQL和连接相关的timeout 的详细整理
- 细化解析:备份MySQL数据库的另类方法
- MYSQL教程MySQL中DATE_FORMATE函数使用时的注意点
- Mysql学习使用navicat 8实现创建数据库和导入数据 管理用户
- php – mysql:在每个连接上设置NAMES utf8?
- 当使用Openfire在两个iOS设备之间聊天时(使用MySQL数据库),
- Mysql实例MAC下Mysql5.7.10版本修改root密码的方法
- Yet Another 10 Common Mistakes Java Developers Make Whe