Mysql主从复制技术(亲测)

开始配置:     第一步:建立复制账号         每一个slave使用标准的MySQL用户名和密码链接master。进行复制操做的用户会授予REPLICATIONSLAVE权限。      用户名的密码都会存储在文本文件master.info中。假如,你想建立repl用户,以下     mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl@'192.168.1.%' IDENTIFIED BY '123456';     第二步:配置My.cnf     配置Master的My.cnf,该文件默认位置为/etc/my.cnf         接下来对master进行配置,包括打开二进制日志,指定惟一的servr ID。例如,在配置文件加入以下值:         [mysqld]         server-id=1         log-bin=mysql-bin         重启mysql,service mysql restart ,         登陆mysql -uroot -p         运行SHOW MASTER STATUS,输出以下: +------------------+----------+--------------+------------------+         | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |         +------------------+----------+--------------+------------------+         | mysql-bin.000002 |      106 |              |                  |         +------------------+----------+--------------+------------------+         1 row in set (0.00 sec)     配置Slave的My.cnf,该文件默认位置为/etc/my.cnf         Slave的配置与master相似,你一样须要重启slave的MySQL。以下:          server-id = 2         log-bin = mysql-bin         relay_log = mysql-relay-bin          log_slave_updates = 1          read_only = 1          server-id是必须的,并且惟一。slave没有必要开启二进制日志,可是在一些状况下,必须设置,例如,若是slave为其它slave的master,必须设置bin_log。在这里,咱们开启了二进制日志,并且显示的命名(默认名称为hostname,可是,若是hostname改变则会出现问题)。  relay_log配置中继日志,log_slave_updates表示slave将复制事件写进本身的二进制日志(后面会看到它的用处)。  有些人开启了slave的二进制日志,却没有设置log_slave_updates,而后查看slave的数据是否改变,这是一种错误的配置。因此,尽可能使用read_only,它防止改变数据(除了特殊的线程)。可是,read_only并是很实用,特别是那些须要在slave上建立表的应用。         重启mysql,service mysql restart ,         登陆mysql -uroot -p     第三步:启动slave         接下来就是让slave链接master,并开始重作master二进制日志中的事件。你不该该用配置文件进行该操做,而应该使用CHANGE MASTER TO语句,该语句能够彻底取代对配置文件的修改,并且它能够为slave指定不一样的master,而不须要中止服务器。以下:         mysql>CHANGE MASTER TO MASTER_HOST='192.168.60.73',MASTER_USER='repl',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=0;         MASTER_LOG_POS的值为0,由于它是日志的开始位置。而后,你能够用SHOW SLAVE STATUS语句查看slave的设置是否正确:         mysql> SHOW SLAVE STATUS\G *************************** 1. row ***************************              Slave_IO_State:                 Master_Host: server1                 Master_User: repl                 Master_Port: 3306               Connect_Retry: 60              Master_Log_File: mysql-bin.000001              Read_Master_Log_Pos: 4              Relay_Log_File: mysql-relay-bin.000001               Relay_Log_Pos: 4              Relay_Master_Log_File: mysql-bin.000001             Slave_IO_Running: No             Slave_SQL_Running: No                              ...omitted...         Seconds_Behind_Master: NULL         Slave_IO_State, Slave_IO_Running, 和Slave_SQL_Running代表slave尚未开始复制过程。日志的位置为4而不是0,这是由于0只是日志文件的开始位置,并非日志位置。实际上,MySQL知道的第一个事件的位置是4。 为了开始复制,你能够运行: mysql> START SLAVE; mysql> SHOW SLAVE STATUS\G 运行SHOW SLAVE STATUS查看输出结果: *************************** 1. row ***************************         Slave_IO_State: Waiting for master to send event                 Master_Host: server1                 Master_User: repl                 Master_Port: 3306                Connect_Retry: 60                Master_Log_File: mysql-bin.000001                Read_Master_Log_Pos: 164               Relay_Log_File: mysql-relay-bin.000001               Relay_Log_Pos: 164               Relay_Master_Log_File: mysql-bin.000001               Slave_IO_Running: Yes               Slave_SQL_Running: Yes                              ...omitted...       Seconds_Behind_Master: 0 注意,slave的I/O和SQL线程都已经开始运行,并且Seconds_Behind_Master再也不是NULL。日志的位置增长了,意味着一些事件被获取并执行了。若是你在master上进行修改,你能够在slave上看到各类日志文件的位置的变化,一样,你也能够看到数据库中数据的变化。 你可查看master和slave上线程的状态。在master上,你能够看到slave的I/O线程建立的链接: mysql> show processlist \G *************************** 1. row ***************************      Id: 1    User: root    Host: localhost:2096      db: test Command: Query    Time: 0  State: NULL    Info: show processlist *************************** 2. row ***************************      Id: 2    User: repl    Host: localhost:2144      db: NULL Command: Binlog Dump    Time: 1838  State: Has sent all binlog to slave; waiting for binlog to be updated    Info: NULL 2 rows in set (0.00 sec) 基本到这里就完成,至于后期的增强操做,我会在另行添加。 Mysql复制的时候能够作到限制复制(主) binlog-do-db=work      #只复制 binlog_ignore_db=mysql    #不容许复制   Replicate_Do_DB=mysql replicate-ignore-db=mysql 另外还有几条经常使用的命令 flush mater;  #清除垃圾 flush slave;  #清除垃圾 start slave;  #开始服务 reset slave;  #重设服务 stop slave;   #中止服务   上面复制方式是假设在新设Master和slave的状况下,实际环境并不十分实用,例如,你在一组运行了好久的Master中加入一个新的slave呢? 这样咱们就须要优先进行数据处理。 1.现将Master的数据库锁定,以避免数据复制的时候出现差别。 FLUSH TABLES WITH READ LOCK; 2. 在另外一个链接用mysqldump建立一个你想进行复制的数据库的转储: shell> mysqldump --all-databases --lock-all-tables >dbdump.db 3. 对表释放锁。  mysql> UNLOCK TABLES; 上面方法中,第2部须要将数据库复制到新slave中还原,这样,Master和新Slave的数据源就一致。 其实第2部的方法有不少,也可使用Mysql软件进行同步,例如:Navicat for Mysql  方法不是惟一,只要结果一致便可。 4.完成旧数据同步后,Master中输入 mysql> show master status; ##获得: +------------------+----------+--------------+---------------------------+ | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB          | +------------------+----------+--------------+---------------------------+ | mysql-bin.000024 |    38113 |              | mysql,test | 1 row in set (0.00 sec) 5.而后在根据上表中内容输入上文启动Slave步骤的内容。 CHANGE MASTER TO MASTER_HOST='192.168.60.73',MASTER_USER='repl',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=0; 6.启动slave START SLAVE; 7.启动完成后进行检查。 mysql> SHOW SLAVE STATUS\G                                                        *************************** 1. row ***************************                Slave_IO_State: Waiting for master to send event                   Master_Host: 192.168.1.171                   Master_User: repl                   Master_Port: 3306                 Connect_Retry: 60               Master_Log_File: mysql-bin.000024               Read_Master_Log_Pos: 38255                Relay_Log_File: mysql-relay-bin.000002                 Relay_Log_Pos: 393               Relay_Master_Log_File: mysql-bin.000024              Slave_IO_Running: Yes             Slave_SQL_Running: Yes               Replicate_Do_DB:           Replicate_Ignore_DB: mysql,wdcpdb,mysql,wdcpdb            Replicate_Do_Table:        Replicate_Ignore_Table:       Replicate_Wild_Do_Table:         Replicate_Wild_Ignore_Table:                    Last_Errno: 0                    Last_Error:                  Skip_Counter: 0           Exec_Master_Log_Pos: 38255               Relay_Log_Space: 548               Until_Condition: None                Until_Log_File:                 Until_Log_Pos: 0            Master_SSL_Allowed: No            Master_SSL_CA_File:            Master_SSL_CA_Path:              Master_SSL_Cert:             Master_SSL_Cipher:                Master_SSL_Key:         Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No           Last_IO_Errno: 0                 Last_IO_Error:                Last_SQL_Errno: 0                Last_SQL_Error: 1 row in set (0.00 sec) 完成 测试过程要主要的问题: 1.请先配置好Mysql 2.开通复制前请将Mysql的库和表的框架复制过去。(在测试一下能不能连表都复制过去!)
相关文章
相关标签/搜索