若天明 发表于 2015-1-16 22:14:01

MYSQL网页编程之具体解说MySQL复制

客户还是可以使用DBaaS系统所能提供的所有能力。数据库云服务消除了组织对专职人员、本地数据库存储设备的需要。他们不必安装、配置和维护任何软硬件。</p>同MongoDB,Redis如许的NoSQL数据库的复制比拟,MySQL复制显得相称庞大!
概述
起首主服务器把数据变更纪录到主日记,然后从服务器经由过程I/O线程读取主服务器上的主日记,而且把它写进到从服务器的中继日记中,接着SQL线程读取中继日记,而且在从服务器上重放,从而完成MySQL复制。详细以下图所示:



MySQL复制
全部历程反应到从服务器上,对应三套日记信息,可在从服务器上用以下命令检察:
mysql>SHOWSLAVESTATUS;

Master_Log_File&Read_Master_Log_Pos:下一个传输的主日记信息。
Relay_Master_Log_File&Exec_Master_Log_Pos:下一个实行的主日记信息。
Relay_Log_File&Relay_Log_Pos:下一个实行的中继日记信息。
了解这些日记信息的寄义关于办理妨碍相当主要,后文会具体论述。
安装
先在主服务器上创立复制账号:
mysql>GRANTREPLICATIONSLAVEON*.*
TO"<SLAVE_USER>"@"<SLAVE_HOST>"
IDENTIFIEDBY"<SLAVE_PASSWORD>";

注:出于平安性和天真性的思索,不要把root等具有SUPER权限用户作为复制账号。
然后设置主服务器设置文件(缺省:/etc/my.cnf):


server_id=100
log_bin=mysql-bin
log_bin_index=mysql-bin.index
sync_binlog=1
innodb_flush_log_at_trx_commit=1
innodb_support_xa=1

注:必定要包管主从服务器各自的server_id独一,制止抵触。
注:假如没有指定log_bin的话,缺省会利用主机名作为名字,云云一来一旦主机名产生改动,就会出成绩,以是保举指定log_bin(从服务器的relay_log存在一样的成绩)。
注:sync_binlog,innodb_flush_log_at_trx_commit,innodb_support_xa三个选项都是出于平安目标设置的,不是复制的必需选项。
接着设置从服务器设置文件(缺省:/etc/my.cnf):


server_id=200
log_bin=mysql-bin
log_bin_index=mysql-bin.index
relay_log=mysql-relay-bin
relay_log_index=mysql-relay-bin.index
read_only=1
skip_slave_start=1
log_slave_updates=1

注:假如用户有SUPER权限,则read_only有效。
注:有了skip_slave_start,除非利用STARTSLAVE命令,不然从服务器不会入手下手复制。
注:设置log_slave_updates,让从服务器纪录日记,有助于在需要时把从切换成主。
上面最主要的步骤是怎样克隆一份主服务器的数据:
假如数据库利用的是MyISAM表范例的话,可按以下体例操纵:
shell>mysqldump--all-databases--master-data=1>data.sql

注:master-data选项缺省会翻开lock-all-tables,并写进CHANGEMASTERTO语句。
假如数据库利用的是InnoDB表范例的话,则应当利用single-transcation:
shell>mysqldump--all-databases--single-transaction--master-data=1>data.sql

有了数据文件,传输到从服务器上并导进:
shell>mysql<data.sql

假如数据量很年夜的话,mysqldump会十分慢,此时间接拷贝数据文件能节俭很多工夫:
在拷贝之前要先锁定命据,然后再取得相干的日记信息(FILE&POSITION):
mysql>FLUSHTABLESWITHREADLOCK;
mysql>SHOWMASTERSTATUS;

接上去拷贝数据文件时,假如是MyISAM表范例的话,间接拷贝便可;假如是InnoDB表范例的话,必定要先中断MySQL服务再拷贝,不然拷贝文件大概没法利用。把拷贝的数据文件间接复制到从服务器的数据目次。
最初还必要再指定一下日记信息:
mysql>CHANGEMASTERTO
MASTER_HOST="<MASTER_HOST>",
MASTER_USER="<SLAVE_USER>",
MASTER_PASSWORD="<SLAVE_PASSWORD>",
MASTER_LOG_FILE="<FILE>",
MASTER_LOG_POS=<POSITION>;

注:不要在my.cnf设置文件里设置MASTER_USER和MASTER_PASSWORD,由于终极失效的是CHANGEMASTERTO天生的master.info文件里的信息。
在主服务器上间接拷贝数据文件固然很快,但必要锁表大概中断服务,这会影响线上服务。假如先前已有了从服务器,那末能够用旧的从服务器做母原本克隆新的从服务器:
先在旧的从服务器上查询日记信息:
mysql>SHOWSLAVESTATUS;

我们必要的是个中的Relay_Master_Log_File&Exec_Master_Log_Pos。
然后在旧的从服务器上依照后面的办法失掉数据,并在新的从服务器上复原。
接着在新的从服务器上设置日记信息:
mysql>CHANGEMASTERTO
MASTER_HOST="<MASTER_HOST>",
MASTER_USER="<SLAVE_USER>",
MASTER_PASSWORD="<SLAVE_PASSWORD>",
MASTER_LOG_FILE="<Relay_Master_Log_File>",
MASTER_LOG_POS=<Exec_Master_Log_Pos>;

不论用谁人办法,最初记得在从服务器上启动复制,并反省事情是不是一般:
mysql>STARTSLAVE;
mysql>SHOWSLAVESTATUS;

假如IO线程和SQL线程都显现Yes,就能够感激天主了:
Slave_IO_Running对应:Master_Log_File&Read_Master_Log_Pos
Slave_SQL_Running对应:Relay_Master_Log_File&Exec_Master_Log_Pos
假如显现No,则申明后面某些设置步骤堕落,大概对应的日记文件有成绩。
妨碍
成绩:主从复制不止何以中断了,我该怎样办?
谜底:复制毛病多数是由于日记毛病引发的,以是起首要弄分明是主日记毛病仍是中继日记毛病,从毛病信息里一样平常就可以判别,假如不克不及可使用相似上面的mysqlbinlog命令:
shell>mysqlbinlog<MASTER_BINLOG_FILE>>/dev/null
shell>mysqlbinlog<SLAVE_BINLOG_FILE>>/dev/null

假如没有毛病,则不会有任何输入,反之假如有毛病,则会显现出来。
假如是主日记毛病,则必要在从服务器利用SETGLOBALsql_slave_skip_counter,以下:
mysql>SETGLOBALsql_slave_skip_counter=1;
mysql>STARTSLAVE;

注:假如有多个毛病,大概必要实行屡次(提示:主从服务器数据大概因而纷歧致)。
假如是中继日记毛病,只需在从服务器利用SHOWSLAVESTATUS了局中的日记信息从头CHANGEMASTERTO便可,体系会丢弃以后的中继日记,从头下载:
mysql>CHANGEMASTERTO
MASTER_LOG_FILE="<Relay_Master_Log_File>",
MASTER_LOG_POS=<Exec_Master_Log_Pos>;
mysql>STARTSLAVE;

至于为何利用的是Relay_Master_Log_File&Exec_Master_Log_Pos,拜见概述。
成绩:主服务器宕机了,怎样把从服务器提拔会主服务器?
谜底:在一主多从的情况总,需选择数据最新的从服务器做新的主服务器。以下图所示:



提拔从服务器为主服务器
在一主(Server1)两从(Server2,、Server3)的情况中,Server1宕机后,比及Server1和Server2把宕机前同步到的日记都实行完,对照Master_Log_File和Read_Master_Log_Pos就能够判别出谁快谁慢,由于Server2从Server1同步的数据(1582)比Server3从Server1同步的数据(1493)新,以是应当提拔Server2为新的主服务器,那末Server3在CHANGEMASTERTO到Server2的时分应当利用甚么样的参数呢?1582-1493=89,而Server2的最初的二进制日记地位是8167,以是谜底是8167-89=8078。
技能
主从服务器中的表可使用分歧的表范例。好比主服务器可使用InnoDB表范例,供应事件,行锁等初级特征,从服务器可使用MyISAM表范例,内存损耗少,易备份等长处。另有一个例子,一台主服务器假如同时带良多个从服务器的话,必将会影响其功能,此时能够拿出一台服务器作为从服务器代办署理,利用BLACKHOLE表范例,只纪录日记,不写数据,由它带多台从服务器,从而提拔功能。
主从服务器中的表可使用分歧的键范例。好比主服务器用InnoDB,键用VARCHAR的话节俭空间,从服务器利用MyISAM,键用CHAR进步速率,由于MyISAM有静态表一说。
主从服务器中的表可使用分歧的索引。主服务器次要用来对付写操纵,以是除主键和独一索引等包管数据干系的索引一样平常都能够不加,从服务器一样平常用来对付读操纵,以是能够针对查询特性设置索引,再进一步,分歧的从服务器能够针对分歧的查询设置分歧的索引。
工具
有一些优异的工具可让你的复制事情失掉事半功倍的效果,具体内容请参考各自文档:
Multi-MasterReplicationManagerforMySQL
PerconaXtraBackup
Maatkit
Tungsten-replicator
别的,GoogleProjectHosting里另有良多风趣的项目,可用mysql+replication标签搜刮。
申明:本文参考了上面列出的书本中相干的内容:
HighPerformanceMySQL:Optimization,Backups,Replication,andMore
MySQLHighAvailability:ToolsforBuildingRobustDataCenters
(火丁条记)
珍贵的资金可以用于其他业务的启动,诸如市场、广告或调研和开发等。

爱飞 发表于 2015-1-19 05:30:57

Mirror可以算是SQLServer的Dataguard了。但是能不能被大伙用起来就不知道了。

老尸 发表于 2015-1-27 22:47:01

对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。

乐观 发表于 2015-2-5 15:42:30

不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关

飘飘悠悠 发表于 2015-2-12 20:12:18

如果,某一版本可以提供强大的并发响应,但是没有Oracle的相应版本稳定,或者价格较贵,那么,它就是不适合的。

若相依 发表于 2015-3-3 08:53:55

SQLServer的异构移植功能个人感觉最好了。(如果对比过SQLServer的链接服务器和Oracle的透明网关的朋友会发现SQLServer的sp_addlinkedserver(openquery)异构数据库系列比Oracle真是强太多了。)

柔情似水 发表于 2015-3-11 10:22:14

大侠们有推荐的书籍和学习方法写下吧。

兰色精灵 发表于 2015-3-18 09:12:30

也可谈一下你是怎么优化存储过程的?

小魔女 发表于 2015-3-25 19:49:50

需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。
页: [1]
查看完整版本: MYSQL网页编程之具体解说MySQL复制