一、mysql支持的复制类型
1、基于语句的复制: 在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时, 会自动选着基于行的复制。
2、基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍. 从mysql5.0开始支持。
3、混合类型的复制: 默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
二、MySQL复制技术有以下一些特点:
1 数据分布
2 负载平衡
3 备份
4 高可用性和容错行
三、复制如何工作, 整体上来说,复制有3个步骤:
1、master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
2、slave将master的binary log events拷贝到它的中继日志(relay log);
3、slave重做中继日志中的事件,将改变反映它自己的数据。
四、主从配置过程:
192.168.83.128 为主数据库服务器
192.168.83.127 为从数据库服务器
主节点:
1、启动二进制日志;
2、为当节点设置一个全局唯一的ID号;
3、创建有复制权限的用户账号;
配置如下:
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
#以下为主从数据库配置
server-id=1 #为主服务器A的ID值
log-bin=mysql-bin #二进制变更日值
从节点:
1、启动中继日志;
2、为当前节点设置一个全局唯一的ID号;
3、使用有复制权限的账号连接至主服务器,并启动复制线程;
配置如下:
log_bin = mysql-bin
server_id = 2
relay_log = mysql-relay-bin
log_slave_updates = 1
read_only = 1
master将改变记录到二进制日志(binary log)中:路径为 datadir=/var/lib/mysql
slave的中继日志(relay log)位置: datadir=/var/lib/mysql
5、创建复制帐号
在Master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE权限。用户名的密码都会存储在文本文件master.info中。
命令如下:
mysql > GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO gps@'192.168.83.127’IDENTIFIED BY ‘1234’;
建立一个帐户backup,并且只能允许从10.100.0.200这个地址上来登陆,密码是1234。
6、启动master和slave
重启master,运行SHOW MASTER STATUS,输出如下:
启动slave,接下来就是让slave连接master,并开始重做master二进制日志中的事件。你不应该用配置文件进行该操作,而应该使用CHANGE MASTER TO语句,该语句可以完全取代
对配置文件的修改,而且它可以为slave指定不同的master,而不需要停止服务器。如下:
change master to master_host=192.168.83.128', master_user='gps' ,master_password='1234', master_log_file='mysql-bin.000001' ,master_log_pos=98;
用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是No
表明slave还没有开始复制过程。日志的位置为4而不是0,这是因为0只是日志文件的开始位置,并不是日志位置。实际上,MySQL知道的第一个事件的位置是4。
为了开始复制,你可以运行:
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G
*************************** 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_IO_Running=Yes
Slave_SQL_Running=Yes
slave的I/O和SQL线程都已经开始运行,而且Seconds_Behind_Master不再是NULL。日志的位置增加了,意味着一些事件被获取并执行了。如果你在master上进行修改,你可以在slave上看到各种日志文件的位置的变化,同样,你也可以看到数据库中数据的变化。
你可查看master和slave上线程的状态。在master上,你可以看到slave的I/O线程创建的连接:
在master上输入show processlist\G;
1、基于语句的复制: 在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时, 会自动选着基于行的复制。
2、基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍. 从mysql5.0开始支持。
3、混合类型的复制: 默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
二、MySQL复制技术有以下一些特点:
1 数据分布
2 负载平衡
3 备份
4 高可用性和容错行
三、复制如何工作, 整体上来说,复制有3个步骤:
1、master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
2、slave将master的binary log events拷贝到它的中继日志(relay log);
3、slave重做中继日志中的事件,将改变反映它自己的数据。
四、主从配置过程:
192.168.83.128 为主数据库服务器
192.168.83.127 为从数据库服务器
主节点:
1、启动二进制日志;
2、为当节点设置一个全局唯一的ID号;
3、创建有复制权限的用户账号;
配置如下:
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
#以下为主从数据库配置
server-id=1 #为主服务器A的ID值
log-bin=mysql-bin #二进制变更日值
从节点:
1、启动中继日志;
2、为当前节点设置一个全局唯一的ID号;
3、使用有复制权限的账号连接至主服务器,并启动复制线程;
配置如下:
log_bin = mysql-bin
server_id = 2
relay_log = mysql-relay-bin
log_slave_updates = 1
read_only = 1
master将改变记录到二进制日志(binary log)中:路径为 datadir=/var/lib/mysql
slave的中继日志(relay log)位置: datadir=/var/lib/mysql
5、创建复制帐号
在Master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE权限。用户名的密码都会存储在文本文件master.info中。
命令如下:
mysql > GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO gps@'192.168.83.127’IDENTIFIED BY ‘1234’;
建立一个帐户backup,并且只能允许从10.100.0.200这个地址上来登陆,密码是1234。
6、启动master和slave
重启master,运行SHOW MASTER STATUS,输出如下:
启动slave,接下来就是让slave连接master,并开始重做master二进制日志中的事件。你不应该用配置文件进行该操作,而应该使用CHANGE MASTER TO语句,该语句可以完全取代
对配置文件的修改,而且它可以为slave指定不同的master,而不需要停止服务器。如下:
change master to master_host=192.168.83.128', master_user='gps' ,master_password='1234', master_log_file='mysql-bin.000001' ,master_log_pos=98;
用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是No
表明slave还没有开始复制过程。日志的位置为4而不是0,这是因为0只是日志文件的开始位置,并不是日志位置。实际上,MySQL知道的第一个事件的位置是4。
为了开始复制,你可以运行:
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G
*************************** 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_IO_Running=Yes
Slave_SQL_Running=Yes
slave的I/O和SQL线程都已经开始运行,而且Seconds_Behind_Master不再是NULL。日志的位置增加了,意味着一些事件被获取并执行了。如果你在master上进行修改,你可以在slave上看到各种日志文件的位置的变化,同样,你也可以看到数据库中数据的变化。
你可查看master和slave上线程的状态。在master上,你可以看到slave的I/O线程创建的连接:
在master上输入show processlist\G;
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)
行2为处理slave的I/O线程的连接。
在slave服务器上运行该语句:
mysql> show processlist \G
*************************** 1. row ***************************
Id: 1
User: system user
Host:
db: NULL
Command: Connect
Time: 2291
State: Waiting for master to send event
Info: NULL
*************************** 2. row ***************************
Id: 2
User: system user
Host:
db: NULL
Command: Connect
Time: 1852
State: Has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
*************************** 3. row ***************************
Id: 5
User: root
Host: localhost:2152
db: test
Command: Query
Time: 0
State: NULL
Info: show processlist
3 rows in set (0.00 sec)
行1为I/O线程状态,行2为SQL线程状态。