-- DNS主 --- DNS从 数据同步不实时 mysql主 -- mysql 从 数据同步实时 mysql replication mysql AB 复制技术(主从) 原理非常类似 oracle dataguard oracle DG (dataguard) 实时 MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。 同步复制需要使用ndb(各集群节点都可读可写)或者drbd(网络raid)这些技术,或者是新版mysql的半同步复制 异步 优点:主速度快 缺点:数据可能主从不同步 同步 优点和缺点和异步正好相反 mysql主 - - > mysql从 create table aaa; bin-log --------> relay-bin-log io sql create table aaa; 把主上的二进制日志(bin-log)的内容传到从上的一个新的日志叫relay-bin-log 从上的 IO 线程 负责传输 从上的 SQL 线程 负责从服务器解析日志 由两个线程 去进行复制的过程 IO线程 sql线程 (以前只使用一个线程,两个是改进后才有的) 复制的过程: 1,slave端的IO线程连上master端,请求 2,master端返回给slave端,bin log文件名和位置信息 3,IO线程把master端的bin log内容依次写到slave端relay bin log里,并把master端的bin-log文件名和位置记录到master.info里。 4,salve端的sql线程,检测到relay bin log中内容更新,就会解析relay log里更新的内容,并执行这些操作;也就是说salve执行和master一样的操作而达到数据同步的目的; 客户 | | web程序,游戏程序(c,php,java.......) | | 代理层 (mysqlproxy,amoeba,cobar) | | mysql主 ----> mysql从 写 读 思考: 1,主要打开二进制日志,从要不要开二进制日志? 从mysql可开可不开,要看情况 2,主和从的读写情况怎么做? 从不能写,从只能读;主可读可写; 所以有些时候做主只写,从只读,也就是读写分离 3,我做了读写分离的一主一从的架构,请问我前端的程序(web,游戏,业务等)如何来访问数据库? 如果装前端web(假设phpwind),填写数据库的IP为主的IP,那么这种情况, mysql从就完全变成了一个实时备份的服务器,所有的读写全在主上 所以要在前端程序和数据库之间加入代理层程序,也就是填写的数据库IP不是主的也不是从的, 而是代理的,由代理来负责把写操作给主,读操作给从 4,关于单点故障的问题,如果从挂掉了,怎么解决?如果主挂掉了,怎么解决? 从挂掉了,那么主就要负责读和写的所有操作,由代理层帮你实现操作的转换。从修好后,直接启动,然后就自动读写分离,还是代理层自动实现操作转换. 主挂掉了(假设挂掉一个小时),那么写操作肯定需要有人来做,只能是mysql从服务器来负责读和写操作。主修好启动后,写操作可以再给回主,但是从在这一小时内写的操作如何给主?(这里就比较麻烦,后面讲双主架构再讨论) 一主一从 关于另几种架构的探讨: 一主多从 -- salve master -- salve -- salve --适合于以读为主的业务,使用多个salve分担读的压力,但要注意的是这种架构,salve越多,那么master复制的压力就越大 ------------------------------------------------ 多主一从 --这种架构不支持 主A phpwind 从C 主B discuz ========================================================== 双主架构 master A <--> master B phpwind主 discuz主 1,会循环复制吗? 他们不会循环复制,因为做复制时会指定ID值,并且不一致 2,两边真的能同时写相同的数据吗? 不可以 如下表所示: 时间点 master A master B 1 a=1改为a=2 2 a=1改为a=3 3 a的改变复制过来,并解析,a会又改为2 4 b的改变复制过来并解析,a又会改为3 问题产生,数据不一致 3,两边可以写不同的数据吗? 可以 可以通过业务程序层,指定一些表的写操作全在一端,另一些表的写操作全在另一端,也就是说两边不会同时写相同的表(当然这是理想状态,因为业务复杂的话会有表的联结等情况) 然后通过指定mysql复制的参数,一部分表或库会从A复制到B,另外一部分表或库从B复制到A就可以避免上面的问题了 或者两个库,一个库master A来写,另一个库master B来写 数据切分 ---------------------------- 前面三个问题也说明了双主架构的第一种应用(就是两边写不关联的数据,互相复制),双主架构的第二种应用就是解决一主一从架构里主挂掉了的问题。 看下面的分析 mysql主 mysql从 思考: 问题1:如果一主一从,主挂了,slave能不能写,如果能写,主修好启起来后,salve写的数据如何传回给主? 答案:主挂了,slave应该要写,否则论坛不能发贴,只能看贴; 主修好后(假设一小时),slave写了这一小时的数据应该要想办法传回主才行。 方法一:DBA人为的把salve这一小时写的数据找出来再导入到主(如果很多表,一小时的操作也非常多,可以说几乎不可能找出这小时改变了啥) 方法二:使用类似rsync的同步方法,这是通过存储层来实现数据同步回去,但效果没有验证过,无法说明 方法三:DBA人为的把从这一小时改变的二进制日志(要确认slave打开二进制日志)给找出来然后应用到主上去 问题2:上面的方法无论哪一种都会有一个问题,就是把从写的一小时数据传回给主需要一定的时间 就是假设这一小时slave创建了一个aaa表,主mysql修好启动后, 如果主马上接管从的写功能,这时前端程序马上给了一个insert into aaa的插入操作,这样肯定会出问题,因为创建aaa表的操作还没有从slave那传回来,如何解决? 解决方法一:人为控制主现在不能写,等slave的数据传回来后再写;但这样的话,等待时间太长了 解决方法二:就是把一主一从的架构改成双主的架构(假设master A和master B) master A --- master B (平时主B只读,不写,只有到主A挂了,才会写) 挂一个小时 读写一个小时 修复后启动了 把读给A 写留给B 问题3:但是改成双主后,master B在master A挂掉的一小时内帮他写了数据,A修好启起来后,B的数据可以自动传回A;但是如果数据量大的话,这个传回也可能需要一定时间,如果正好在这个传回时间内也出现了问题2的情况,又如何解决? 解决方法一:人为控制主不能写,这样的话等待时间很短(因为是自动传回来,跟手动导回来速度快很多),影响不大 解决方法二:就直接把master B 做为新的写服务器,master A启动后,也只是做为读服务器;除非等下一次B挂了,A会重新成为写服务器(当然这是在两台服务器性能相等的情况下) 总结:上面说明双主架构的两种应用 ------------------------------------------------------ master C | | 环型架构 master A -- master B --不可行 ------------------------------------------------------ -- salve 级联架构 master -- salve -- salve -- salve 为了解决一主多从的master的复制压力 可以把slave做为下一级从机的master 增加复制的级联层次,造成的延迟更长 所以这种架构并不是很推荐,一般会进行分拆集群 -------------------------------------------------- 双主和级联合起来 master ----salve --slave | | -- slave master ---salve -- slave -- slave ----------------------------------------------------- 优化原则:分 大型结构的数据量太大,要用到数据切分(水平,垂直) mysqlproxy amoeba cobar --------------------------------------------------------- AB复制前准备 把两台mysql启起来(要求两台数据一致) /etc/hosts里都加上主机名和IP对应, 时间同步好 防火墙,selinux检查一下 yum配置 mysql AB复制开始搭建 1,主从数据必须要同步 2,主:要启用二进制日志 /etc/my.cnf log-bin=xxxxx 3,主和从都要设置 server-id值,并且两边要不一样 4,需要建立一个用来复制的用户,并授于相应权限 master -- slave 10.1.1.6 10.1.1.7 第一步;改配置文件 master的 [mysqld] log-bin=mysql-bin server-id=2 slave的 [mysqld] server-id=3 然后重启服务 第二步:授权 master上授权,super和replication slave都是复制要用的权限 mysql> grant super,replication slave on *.* to 'li'@'10.1.1.7' identified by '123'; mysql> flush privileges; 第三步:查看master的正在写的二进制文件名和位置 mysql> flush tables with read lock; --先加锁,防止两边数据不一致;如果业务还未上线,这个就没有必要了 Query OK, 0 rows affected (0.00 sec) mysql> show master status; --只有打开二进制日志,这句命令才有结果,表示当前数据库的二进制日志写到什么位置 +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 563 | | | +------------------+----------+--------------+------------------+ 二进制文件名 正在写入的位置 主 从 .000001 1 跑了一年 跑了一年的数据 .000004 563 从主备份恢复到从上十分钟跑的数据 .000004 800 思考几种情况下做复制的区别: 1,还没有上线的情况 2,主已经跑了一年,一直都有开着二进制日志,并且日志无丢失 3,主已经跑了一年,但没有打开二进制日志 4,主以前跑了半年没打开二进制日志,后半年打开了二进制日志,你现在要做从 slave端的配置 mysql> slave stop; --如果没有启过slave,这一步也是非必要的 Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> show warnings; +-------+------+--------------------------------+ | Level | Code | Message | +-------+------+--------------------------------+ | Note | 1255 | Slave already has been stopped | +-------+------+--------------------------------+ mysql> change master to -> master_user='li', -> master_password='123', -> master_host='10.1.1.6', --主的IP -> master_port=3306, --端口,如果为3307就要换成3307 -> master_log_file='mysql-bin.000001', --主上面查到的文件名 -> master_log_pos=563; --主上面查到的位置号 mysql> start slave; Query OK, 0 rows affected (0.00 sec) mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.1.1.6 Master_User: li Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 563 Relay_Log_File: mysql55-relay-bin.000002 Relay_Log_Pos: 253 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes --这里两个YES,表示两个线程OK Replicate_Do_DB: Replicate_Ignore_DB: 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: 563 Relay_Log_Space: 411 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: Replicate_Ignore_Server_Ids: Master_Server_Id: 2 1 row in set (0.00 sec) ................................... 回到master端解锁: mysql> unlock tables; Query OK, 0 rows affected (0.00 sec) 进行测试: 1,比较主,从的数据目录文件的不同 [root@master ~]# ls /var/lib/mysql/ --主的 aaa ib_logfile0 mysql mysql-bin.index test ibdata1 ib_logfile1 mysql-bin.000001 mysql.sock [root@slave ~]# ls /var/lib/mysql/ --从的 aaa ib_logfile1 mysqld-relay-bin.000003 mysql.sock ibdata1 master.info mysqld-relay-bin.000004 relay-log.info ib_logfile0 mysql mysqld-relay-bin.index test [root@slave ~]# cat /var/lib/mysql/master.info [root@slave ~]# cat /var/lib/mysql/relay-log.info 验证2:只有master写,slave可以看到 slave写,master看不到 如果复制出现问题 (要模拟问题的话,在从上创建一个库,然后在主上也创建这个库,就会冲突,造成复制出现问题), 重做复制集群只需要重新,stop slave; change master to ...... ; start slave; 验证3:把从重启后,再上去查看状态,还是连接的,没什么影响 把主重启后,再去slave上去查看状态,发现重试时间为60秒,等60秒后又自动连接OK了 --如果想要改这个60秒的话,可以把从服务器上的master.info文件里的60直接改成30(rpm版测试有点问题) 验证4: 如果在主上把复制的授权用户给修改了密码,那么复制是否仍然OK? 结果:复制仍然OK,但如果从重启后,IO线程就是NO了。需要重新stop slave; change master to .... ;start slave; ------------------------------------------------------------ 一主多从的做法 就是上面的步骤有几个从就做几次 ------------------------------------------------------------------- 双主架构的做法: 在上面的slave机也打开二进制日志,反着做一遍就行,注意做的过程中,保证数据一致 做好的架构,只要两边不同时操作相同的数据,就不会出现复制不一致的问题; 或者是在业务程序层,将一部分的写操作定义到master A,另一部分的写操作定义到master B 如: 关于控制复制的库和表的相关参数讨论: Replicate_Do_DB: --接受哪个库的复制 Replicate_Ignore_DB: --忽略哪个库的复制 Replicate_Do_Table: --接受哪个表的复制 Replicate_Ignore_Table: --忽略哪个表的复制 Replicate_Wild_Do_Table: --通配符表示复制哪些表 Replicate_Wild_Ignore_Table: --通配符表示忽略哪些表 实例说明: master A slave B 1,先把两台做成ab复制的架构 2,在master a上创建aaa库及其里面的aaa表,bbb库及其里面的bbb表 那么slave b里也会复制产生这两张测试表 3,现在的业务需求是: 我在slave b上要求复制的为aaa里所有表;bbb库及其所有表不要求复制过去 4,在slave b的my.cnf配置文件的[mysqld]参数组里加上 replicate_do_db=aaa --只接受aaa库的复制 replicate_ignore_db=bbb --忽略bbb库的复制 5,重启slave b,然后测试 测试结果为 在master a上操作: use aaa; insert into aaa values ....; slave b上可以看到insert的记录 --OK 在master a 上操作: use bbb; insert into bbb values ....; slave b上看不到insert的记录 --OK;但这里的操作还是会记录到slave b的relay-bin-log里 在master a上操作: use bbb; insert into aaa.aaa values ....; slave b上却看不到insert的操作 --有问题 --原因是:它默认只会复制在aaa库下对它下面的表的操作;而别的库下对aaa库下表的操作会忽略 6,解决方法: 在slave b上把第4步做的两个参数换成下面两个 replicate_wild_do_table=aaa.% replicate_wild_ignore_table=bbb.% 再把slave b重启;就不会出现刚才的问题了 ------------------------------------------------------------- 级联架构 master -slave -slave 把中间的从也要打开二进制日志。但是它默认不把应用master的操作记录到自己的二进制日志。所以需要打开一个参数让它记录,才可以传给第三级的从 # /usr/local/mysql/bin/mysqld --verbo --help |grep log-slave --log-slave-updates Tells the slave to log the updates from the slave thread --log-slave-updates is used. log-slave-updates FALSE --默认值为false,所以需要在配置文件里加上log-slave-updates=1,然后重启服务 所以打开中间从的配置文件 # vim /usr/local/mysql/etc/my.cnf --加上下面两句,然后重启服务 log-bin=mid-slave log-slave-updates=1 然后在中间从和第三级的从之间再做一次AB复制就可以了 我的结构图 master A slave B slave C 10.1.1.6 10.1.1.7 10.1.1.8 sever-id=2 server-id=3 server-id=4 log-bin=master log-bin=mid-slave log-slave-updates=1 bin-log relay-bin-log relay-bin-log bin-log ------> relay-bin-log 打开log-slave-updates=1 让第一台传过来relay日志记录 到自己的二进制日志 bin-log -------> relay-bin-log ======================================================================= mysql半同步复制 MySQL的默认复制其实是异步操作,而不是同步,也就意味着允许主从之间的数据存在一 定的延迟,mysql当初这样设计的目的也是基于可用性的考虑,为了保证master 不受slave的影响,并且异步复制使得master处于一种性能最优的状态: 写完binlog后即可提交而不需要等待slave的操作完成。这样存在一个隐患,当你使用slave作为备份时 如果master挂掉,那么会存在部分已提交的事务未能成功传输到slave的可能,这就意味着数据丢失! mysql 主 ---- mysql从 所谓的半同步复制就是master每commit一个事务,要slave应用这个事物后回给master信号。这样master才能把事物成功commit。这样就保证了master-slave的数据绝对的一致(但是以牺牲master的性能为代价).但等待时间也是可以调整的。 mysql半同步复制等待时间超时后(默认时间为10秒),会自动转换成异步复制 与oracle DG(data guard)做对比 DG里有三种模式 最大性能 类似mysql里默认的异步复制 最大保护 类似mysql今天要做的半同步复制 最大可用 ------------------------------------------- 搭建环境 两台虚拟机 master -- slave 先安装mysql5.5之后的版本,因为这个版本之后才实现的半同步复制 第一大步: 先要搭建好mysqlAB异步复制 过程省略 第二大步:在异步基础上转成半同步复制 1,在master上安装这个插件 master> install plugin rpl_semi_sync_master soname 'semisync_master.so'; Query OK, 0 rows affected (0.00 sec) --删除插件的方法 mysql > uninstall plugin rpl_semi_sync_master; master> show global variables like 'rpl_semi_sync%'; --安装OK后,主上会多几个参数 +------------------------------------+-------+ | Variable_name | Value | +------------------------------------+-------+ | rpl_semi_sync_master_enabled | OFF | --是否启用master的半同步复制 | rpl_semi_sync_master_timeout | 10000 | --默认主等待从返回信息的超时间时间,10秒。 | rpl_semi_sync_master_trace_level | 32 | --监控 | rpl_semi_sync_master_wait_no_slave | ON | --是否允许每个事物的提交都要等待slave的信号.on为每一个事物都等待 +------------------------------------+-------+ 2,在slave上安装插件 slave> install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; Query OK, 0 rows affected (0.03 sec) slave> show global variables like 'rpl_semi_sync%'; +---------------------------------+-------+ | Variable_name | Value | +---------------------------------+-------+ | rpl_semi_sync_slave_enabled | OFF | | rpl_semi_sync_slave_trace_level | 32 | +---------------------------------+-------+ 3,master上激活半同步复制 master> set global rpl_semi_sync_master_enabled =on; Query OK, 0 rows affected (0.00 sec) 4,slave上激活半同步复制 slave> set global rpl_semi_sync_slave_enabled=on; slave> stop slave IO_THREAD; slave> start slave IO_THREAD; 5,在master查看状态 master > show global status like 'rpl_semi_sync%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 1 | --有一个从服务器启用半同步复制 | Rpl_semi_sync_master_net_avg_wait_time | 0 | --master等待slave回复的平均等待时间。单位毫秒 | Rpl_semi_sync_master_net_wait_time | 0 | --master总的等待时间。单位毫秒 | Rpl_semi_sync_master_net_waits | 0 | --master等待slave回复的总的等待次数 | Rpl_semi_sync_master_no_times | 0 | --master关闭半同步复制的次数 | Rpl_semi_sync_master_no_tx | 0 | --master 等待超时的次数 | Rpl_semi_sync_master_status | ON | --标记master现在是否是半同步复制状态 | Rpl_semi_sync_master_timefunc_failures | 0 | --master调用时间(如gettimeofday())失败的次数 | Rpl_semi_sync_master_tx_avg_wait_time | 0 | --master花在每个事务上的平均等待时间 | Rpl_semi_sync_master_tx_wait_time | 0 | --master花在事物上总的等待时间 | Rpl_semi_sync_master_tx_waits | 0 | --master事物等待次数 | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | --后来的先到了,而先来的还没有到的次数 | Rpl_semi_sync_master_wait_sessions | 0 | --当前有多少个session因为slave回复而造成等待 | Rpl_semi_sync_master_yes_tx | 0 | --标记slave是否在半同步状态 +--------------------------------------------+-------+ 6,在slave上查看状态就只有下面一条信息 slave > show global status like 'rpl_semi_sync%'; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Rpl_semi_sync_slave_status | ON | +----------------------------+-------+ 第三大步 测试: master > insert into a values (3); Query OK, 1 row affected (0.01 sec) master > show global status like 'rpl_semi_sync%_yes_tx'; +-----------------------------+-------+ | Variable_name | Value | +-----------------------------+-------+ | Rpl_semi_sync_master_yes_tx | 1 | --表示这次事物成功从slave返回一次确认信号 +-----------------------------+-------+ 模拟错误,把slave上的mysql停掉 --再回到master上测试 master> insert into a values (4); Query OK, 1 row affected (10.00 sec) --这次插入一个值需要等待10秒(默认的等待时间) master> insert into a values (5); Query OK, 1 row affected (0.01 sec) --现在自动转成了原来的异步模式(类似oracle DG里的最大性能模式) 再次把slave启动,看到半同步复制没启来,是异步模式 重新按下面的步骤把同步模式再启起来就可以了 slave> set global rpl_semi_sync_slave_enabled=on; slave> stop slave IO_THREAD; slave> start slave IO_THREAD; slave启起来后,查看表,发现刚才slave关闭期间的那几条数据还是会自动复制过来,数据又回到一致 ===================================================================== mysql的延时复制(IO线程是实时,只是把SQL线程延时了) 异步或同步复制 A ----------> B | |-------> C 延时1天 误删除一张用了好几年的数据表 恢复方法: 1,通过每周的备份来恢复(假设周一0点全备,周三误删除) 先恢复周一的全备到测试库上,然后再恢复全备到现在的二进制日志(除了误删除的那句),再把那张表导出来,导回到生产库上 2,完全通过二进制日志来恢复 需要把这几年内所有的二进制日志先合并,再通过sed,grep,awk等把这张表从建表到现在的所有操作按顺序找出来(当然要除掉你最后误删除的那条),然后应用回去 3,有延时复制的话,在C上导出这张表,导回A mysql开源管理工具 maatkit --perl写的,老外常用 软件路径在 笔记目录下/mysql_soft/maatkit-7540.tar.gz --在mysql AB的slave上安装(只需要在slave上安装,包含下面的步骤都是在slave上做的) # tar xf maatkit-7540.tar.gz -C /usr/src/ # cd /usr/src/maatkit-7540/ 安装方法README文件里有写 # perl Makefile.PL --如果不成功,需要安装perl有关的多个包,可以yum install perl* # make install [root@li maatkit-7540]# ls bin/ --这些命令,就是各个管理工具 mk-archiver mk-purge-logs mk-checksum-filter mk-query-advisor mk-config-diff mk-query-digest mk-deadlock-logger mk-query-profiler mk-duplicate-key-checker mk-show-grants mk-error-log mk-slave-delay mk-fifo-split mk-slave-find mk-find mk-slave-move mk-heartbeat mk-slave-prefetch mk-index-usage mk-slave-restart mk-kill mk-table-checksum mk-loadavg mk-table-sync mk-log-player mk-table-usage mk-merge-mqd-results mk-tcp-model mk-parallel-dump mk-upgrade mk-parallel-restore mk-variable-advisor mk-profile-compact mk-visual-explain --使用--help查看一个命令的使用方法 # mk-slave-delay --help mk-slave-delay starts and stops a slave server as needed to make it lag behind the master. The SLAVE-HOST and MASTER-HOST use DSN syntax, and values are copied from the SLAVE-HOST to the MASTER-HOST if omitted. For more details, please use the --help option, or try 'perldoc /usr/bin/mk-slave-delay' for complete documentation. # perldoc /usr/bin/mk-slave-delay --查看文档 或者直接man mk-slave-delay --mysql AB(无论同步或异步)正在运行OK的情况下,使用下面的命令在slave上运行;做之间建议把时间同步一下 # mk-slave-delay --defaults-file=/usr/local/mysql/etc/my.cnf --delay=1m --interval=15s --user=root --password=123 --socket=/mysqldata56/mysql56.socket --quiet localhost & --表示延时1分钟,才会应用SQL线程;这里是测试所以才使用很小的时间,实际情况可以调成1小时或2小时 测试: 在master上随便插入几条数据 然后在slave上发现没有马上同步过来 slave > show slave status\G; --查看状态会发现SQL线程状态为NO Slave_IO_Running: Yes Slave_SQL_Running: NO 大概等1分钟,就会自动延时同步过来了; --注意:日志已经传到slave的relay-bin log里了,但由SQL线程延时去解析 ================================= 原理理解题 题1 mysql架构中,一主多从,双主,级联(多主一从和环型不支持)这三种的区别和优缺点 题2 如果现在一个小公司mysql数据库已经跑了一年,现在要搭建mysqlAB复制,你检查了主库后,发现它这一年都没有使用二进制日志,请问如何做复制? 1,开二进制日志,重启服务 2,全备主库,恢复到备库 3,开始做复制,在备库上用change master to指定从备份那个时间点的日志position开始复制。 题3 在实际的大数据量的数据库中,因为负载太高或者网络问题,现在造成复制时的数据延时,请问你如何做为DBA应该如何去处理? 有问题就去解决 没问题,仍然会有延时,则说明负载太高了,则扩展架构了 题4 如果一个lamp架构在深圳机房在运行,如何尽量无影响的把这个lamp迁移到惠州的机房 1,在惠州那边先搭建lamp,其中web内容可以和深圳的这边做rsync远程实时同步,mysql做双主 2,改DNS的A记录,把IP由深圳的换成惠州的 3,过一段时间(等深圳服务器没有连接了),就可以关闭深圳服务器了。 stop slave;