1.1 mysql支持的复制类型: mysql
基于语句的复制:在主服务器上执行的SQL语句,在从服务器上执行一样的语句。MySQL默认采用基于语句的复制,效率比较高。一旦发现无法精确复制时,会自动选着基于行的复制。sql
基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍. 从mysql5.0开始支持数据库
混合类型的复制: 默认采用基于语句的复制,一旦发现基于语句的没法精确的复制时,就会采用基于行的复制。vim
1.2 复制的原理缓存
master将改变记录到二进制日志(binary log)中(这些记录叫作二进制日志事件,binary log events);安全
slave将master的binary log events拷贝到它的中继日志(relay log);服务器
slave重作中继日志中的事件,将更改应用到本身的数据上。ide
1.该过程的第一部分就是master记录二进制日志。在每一个事务更新数据完成以前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即便事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
下一步就是slave将master的binary log拷贝到它本身的中继日志。首先,slave开始一个工做线程——I/O线程。I/O线程在master上打开一个普通的链接,而后开始binlog dump process。Binlog dump
process从master的二进制日志中读取事件,若是已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志一般会位于OS的缓存中,因此中继日志的开销很小。
此外,在master中也有一个工做线程:和其它MySQL的链接同样,slave在master中打开一个链接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操做不能在slave上并行操做。spa
2.复制配置 有两台MySQL数据库服务器Master和slave,Master为主服务器,slave为从服务器,初始状态时,Master和slave中的数据信息相同,当Master中的数据发生变化时,slave也跟着发生相应的变化,使得master和slave的数据信息同步,达到备份的目的。
3.要点:
负责在主、从服务器传输各类修改动做的媒介是主服务器的二进制变动日志,这个日志记载着须要传输给从服务器的各类修改动做。所以,主服务器必须激活二进制日志功能。从服务器必须具有足以让它链接主服务器并请求主服务器把二进制变动日志传输给它的权限。线程
1.3版本问题
1.主从服务器版本是否同样,尽可能保持一下
----------------------------------------分割线---------------------------------------------------------------------------------------------
使用版本 mysql Ver 15.1 Distrib 5.5.50-MariaDB
一、启用二进制日志
vim /etc/my.cnf
log-bin = mysql-bin #二进制日志文件,此项为必填项,不然不能同步数据;
binlog_format = mixed
expire_logs_days = 7
server-id = 1 #这是数据库ID,此ID是惟一的,主库默认为1,其余从库以此ID进行递增,ID值不能重复,不然会同步出错;
sync_binlog = 1 #主从复制时的事务安全
binlog-do-db = mediaman #须要同步的数据库,若是须要同步多个数据库;
二、主服务器---建立同步帐号
grant replication slave on . to saas@10.27.177.XX identified by 'XXXXXX';
三、重启mysql,运行 SHOW MASTER STATUS
三、从服务器配置
vim /etc/my.cnf
server-id = 2
#relay_log = mysql-relay-bin 默认值 mariadb-relay-bin
四、从服务链接Master服务器
change master to master_host = '10.27.177.XX', master_user = 'saas', master_port=3306, master_password='XXXXX', master_log_file = 'mysql-bin.000112', master_log_pos=278736;
五、在Slave上面启动复制线程:
START SLAVE;
5.1 是否开始复制(都为Yes)为正确
Slave_IO_Running:Yes
Slave_SQL_Running: Yes
SHOW SLAVE STATUSG
六、master显示show processlist\G
七、slave显示show processlist\G
八、设置主从同步--slave_skip_errors
1简介
mysql在主从复制过程当中,因为各类的缘由,从服务器可能会遇到执行BINLOG中的SQL出错的状况,在默认状况下,服务器会中止复制进程,再也不进行同步,等到用户自行来处理。 slave-skip-errors的做用就是用来定义复制过程当中从服务器能够自动跳过的错误号,当复制过程当中遇到定义的错误号,就能够自动跳过,直接执行后面的SQL语句。
2参数说明
slave_skip_errors选项有四个可用值,分别为:off,all,ErorCode,ddl_exist_errors。 默认状况下该参数值是off,咱们能够列出具体的error code,也能够选择all,mysql5.6及MySQL Cluster NDB 7.3以及后续版本增长了参数ddl_exist_errors,该参数包含一系列 errorcode(1007,1008,1050,1051,1054,1060,1061,1068,1094,1146) 一些error code表明的错误以下: 1007:数据库已存在,建立数据库失败 1008:数据库不存在,删除数据库失败 1050:数据表已存在,建立数据表失败 1051:数据表不存在,删除数据表失败 1054:字段不存在,或程序文件跟数据库有冲突 1060:字段重复,致使没法插入 1061:重复键名 1068:定义了多个主键 1094:位置线程ID 1146:数据表缺失,请恢复数据库 1053:复制过程当中主服务器宕机 1062:主键冲突 Duplicate entry '%s' for key %d my.cnf中的写法: slave_skip_errors=1062,1053 slave_skip_errors=all slave_skip_errors=ddl_exist_errors