a. MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。每个从服务器从主服务器接收主服务器上已经记录到其二进制日志的保存的更新。当一个从服务器连接主服务器时,它通知主服务器定位到从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,并在本机上执行相同的更新。然后封锁并等待主服务器通知新的更新。从服务器执行备份不会干扰主服务器,在备份过程中主服务器可以继续处理更新。
b. MySQL使用3个线程来执行复制功能,其中两个线程(Sql线程和IO线程)在从服务器,另外一个线程(IO线程)在主服务器。 当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以即为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,由从服务器创建,用于读取中继日志并执行日志中包含的更新。在从服务器上,读取和执行更新语句被分成两个独立的任务。当从服务器启动时,其I/O线程可以很快地从主服务器索取所有二进制日志内容,即使SQL线程执行更新的远远滞后。
(2)在slave数据库中导入从master传过来的数据。 mysql> CREATE DATABASE liting CHARACTER SET utf8 COLLATE utf8_general_ci; #先创建一个liting空库,否则下面导入数据时会报错说此库不存在。 mysql> use liting; mysql> source /opt/liting.sql; #导入master中多余的数据。 .......
(3)配置主从同步指令 mysql> stop slave; #执行同步前,要先关闭slave mysql> change master to master_host='172.31.225.250',master_user='repl',master_password='repl123',master_log_file='mysql-bin.000007',master_log_pos=120;
mysql> start slave; mysql> show slave status \G; ....... *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.31.225.250 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000007 Read_Master_Log_Pos: 120 Relay_Log_File: mysql-relay-bin.000002 Relay_Log_Pos: 279 Relay_Master_Log_File: mysql-bin.000007 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: liting Replicate_Ignore_DB: mysql ............. Seconds_Behind_Master: 0
如上,当IO和SQL线程的状态均为Yes,则表示主从已实现同步了!
下面测试下Mysql主从同步的效果 在master主数据库上写入新数据 mysql> use liting; mysql>create table if not exists haha (id int(10) PRIMARY KEY AUTO_INCREMENT,name varchar(50) NOT NULL); Query OK, 0 rows affected (0.02 sec) mysql> insert into huanqiu.haha values(100,"anhui"); Query OK, 1 row affected (0.00 sec)
然后在slave数据库上查看,发现master上新写入的数据已经同步过来了 mysql> select * from liting.haha; +-----+-----------+ | id | name | +-----+-----------+ | 100 | anhui | +-----+-----------+ 1 rows in set (0.00 sec)
数据同步授权(iptables防火墙开启3306端口,要确保对方机器能使用下面权限连接到本机mysql) mysql> grant replication slave,replication client on *.* to repl@'172.31.225.%' identified by "repl123"; mysql> flush privileges;
数据同步授权(iptables防火墙开启3306端口,要确保对方机器能使用下面权限连接到本机mysql) 同理,slave也要授权给master机器远程同步数据的权限 mysql> grant replication slave ,replication client on *.* to repl@'172.31.225.%' identified by "repl123"; mysql> flush privileges;
mysql> FLUSH TABLES WITH READ LOCK; mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 256 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
(4)最后测试下Mysql主主同步的效果 在master上写入新数据 mysql> select * from liting.haha; +-----+-----------+ | id | name | +-----+-----------+ | 100 | anhui | +-----+-----------+ 1 rows in set (0.00 sec)
mysql> insert into huanqiu.haha values(10,"beijing");
在slave数据库中查看,发现master新写入的数据已经同步过来了 mysql> select * from liting.haha; +-----+------------+ | id | name | +-----+------------+ | 10| beijing | | 100 | anhui | +-----+------------+ 2 rows in set (0.00 sec)
在slave上删除数据 mysql> delete from liting.haha where id=100;
在master数据库中查看 mysql> select * from liting.haha; +-----+------------+ | id | name | +-----+------------+ | 10 | beijing | +-----+------------+ 3 rows in set (0.00 sec)
a. MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。每个从服务器从主服务器接收主服务器上已经记录到其二进制日志的保存的更新。当一个从服务器连接主服务器时,它通知主服务器定位到从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,并在本机上执行相同的更新。然后封锁并等待主服务器通知新的更新。从服务器执行备份不会干扰主服务器,在备份过程中主服务器可以继续处理更新。
b. MySQL使用3个线程来执行复制功能,其中两个线程(Sql线程和IO线程)在从服务器,另外一个线程(IO线程)在主服务器。 当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以即为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,由从服务器创建,用于读取中继日志并执行日志中包含的更新。在从服务器上,读取和执行更新语句被分成两个独立的任务。当从服务器启动时,其I/O线程可以很快地从主服务器索取所有二进制日志内容,即使SQL线程执行更新的远远滞后。
(2)在slave数据库中导入从master传过来的数据。 mysql> CREATE DATABASE liting CHARACTER SET utf8 COLLATE utf8_general_ci; #先创建一个liting空库,否则下面导入数据时会报错说此库不存在。 mysql> use liting; mysql> source /opt/liting.sql; #导入master中多余的数据。 .......
(3)配置主从同步指令 mysql> stop slave; #执行同步前,要先关闭slave mysql> change master to master_host='172.31.225.250',master_user='repl',master_password='repl123',master_log_file='mysql-bin.000007',master_log_pos=120;
mysql> start slave; mysql> show slave status \G; ....... *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.31.225.250 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000007 Read_Master_Log_Pos: 120 Relay_Log_File: mysql-relay-bin.000002 Relay_Log_Pos: 279 Relay_Master_Log_File: mysql-bin.000007 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: liting Replicate_Ignore_DB: mysql ............. Seconds_Behind_Master: 0
如上,当IO和SQL线程的状态均为Yes,则表示主从已实现同步了!
下面测试下Mysql主从同步的效果 在master主数据库上写入新数据 mysql> use liting; mysql>create table if not exists haha (id int(10) PRIMARY KEY AUTO_INCREMENT,name varchar(50) NOT NULL); Query OK, 0 rows affected (0.02 sec) mysql> insert into huanqiu.haha values(100,"anhui"); Query OK, 1 row affected (0.00 sec)
然后在slave数据库上查看,发现master上新写入的数据已经同步过来了 mysql> select * from liting.haha; +-----+-----------+ | id | name | +-----+-----------+ | 100 | anhui | +-----+-----------+ 1 rows in set (0.00 sec)
数据同步授权(iptables防火墙开启3306端口,要确保对方机器能使用下面权限连接到本机mysql) mysql> grant replication slave,replication client on *.* to repl@'172.31.225.%' identified by "repl123"; mysql> flush privileges;
数据同步授权(iptables防火墙开启3306端口,要确保对方机器能使用下面权限连接到本机mysql) 同理,slave也要授权给master机器远程同步数据的权限 mysql> grant replication slave ,replication client on *.* to repl@'172.31.225.%' identified by "repl123"; mysql> flush privileges;
mysql> FLUSH TABLES WITH READ LOCK; mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 256 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
(4)最后测试下Mysql主主同步的效果 在master上写入新数据 mysql> select * from liting.haha; +-----+-----------+ | id | name | +-----+-----------+ | 100 | anhui | +-----+-----------+ 1 rows in set (0.00 sec)
mysql> insert into huanqiu.haha values(10,"beijing");
在slave数据库中查看,发现master新写入的数据已经同步过来了 mysql> select * from liting.haha; +-----+------------+ | id | name | +-----+------------+ | 10| beijing | | 100 | anhui | +-----+------------+ 2 rows in set (0.00 sec)
在slave上删除数据 mysql> delete from liting.haha where id=100;
在master数据库中查看 mysql> select * from liting.haha; +-----+------------+ | id | name | +-----+------------+ | 10 | beijing | +-----+------------+ 3 rows in set (0.00 sec)