2、下面我们来看看如何配置数据同步(A->B)Q?br />
(W者mysql版本 5.0.26)
假设数据库AZ机(向B提供同步服务Q即B中的数据来自AQ:
A机器Q?br />
IP = 192.168.1.101
B机器Q?br />
IP = 192.168.1.102
(1).在A机器中有数据库如下:
//数据库A
CREATE DATABASE backup_db;
USE backup_db;
CREATE TABLE `backup_table` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(20) character set utf8 NOT NULL,
`sex` varchar(2) character set utf8 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
#A机器的my.cnf(或my.ini)中应该配|:
server-id=1
log-bin=c:\mysqlback #同步事g的日志记录文?br />
binlog-do-db=backup_db #提供数据同步服务的数据库
(2).在B机器中有数据库如下:
//数据库B
CREATE DATABASE backup_db;
USE backup_db;
CREATE TABLE `backup_table` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(20) character set utf8 NOT NULL,
`sex` varchar(2) character set utf8 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
注:数据库A和B的数据库l构一定要相同Q否则无法构成同步?/p>
#B机器的my.cnf(或my.ini)中应该配|:
server-id=2
master-host=192.168.1.101 #LA的地址
master-user=ym #LA提供lB的用P该用户中需要包括数据库backup_db的权?br />
master-password=ym #讉K密码
master-port=3306 #端口Q主机的MYSQL端口
master-connect-retry=60 #重试间隔60U?br />
replicate-do-db=backup_db #同步的数据库
(3).完成了以上配|之后,A的mysql数据的权限给B?br /> A机器Q?br /> mysql>GRANT FILE ON *.* TO ym@'192.168.1.102' IDENTIFIEDBY ‘ym’;
(4).重启AB数据库,后:
B机器Q?br />
mysql>slave start;
查看同步配置情况
A机器Q?br />
mysql>show master status;
B机器Q?br />
mysql>show slave status;
(5).在A中的backup_db.backup_table表中插入一些数据,查看B中的backup_db.backup_table表是否同步了数据改动。如果没有看到同步数据结果,卛_步不成功Q请查看错误Q如下)?br /> 当有错误产生?.err日志文gQ可到mysql安装目录下找Q,同步的线E退出。当U正错误后重复步?4)?/p>
3、实现双向热?A<=>B)Q?br />
以上的(1)-(5)步骤按A-B双向配置卛_?br />
异步复制基本原理
从MySQL3.23.15以后QMySQL支持单向的异步复制。也是_1台MySQL服务器充当Master(d)Q?台或多台MySQL服务器充当Slaves(从库)Q数据从Master向Slavesq行异步复制。注意,q种复制是异步的Q有别于MySQL的同步复制实玎ͼq种实现U做MySQL集群QMySQL ClusterQ?
当主库有更新的时候,d会把更新操作的SQL写入二进制日?Bin log)Qƈl护一个二q制日志文g的烦引,以便于日志文件轮回(RotateQ。在从库启动异步复制的时候,从库会开启两个I/OU程Q其中一个线E连接主库,要求d把二q制日志的变化部分传l从库,q把传回的日志写入本地磁盘。另一个线E则负责d本地写入的二q制日志Qƈ在本地执行,以反映出q种变化。较老的版本在复制的时候只启用一个I/OU程Q实现这两部分的功能?
有几个关键性的地方需要注意:
- d必须启用Bin logQ主库和从库必须有唯一的Server Id
- 从库必须清楚了解从主库的哪一个Bin log文g的哪一个偏UM|v开始复?
- 从库可以从主库只复制指定的数据库Q或者数据库的某些数据表
- d和从库的数据库名U可以不一P不过q是推荐使用一L名称
- d和从库的MySQL版本需保持一?
附:资料出处
http://www.javaeye.com/topic/153875
http://blog.sina.com.cn/s/blog_4b0710d8010007eo.html
数据库服务的主要瓉Q单个服务的q接数。对于一个应用来_如果数据库表l构的设计能够按照数据库原理的范式来设计的话Qƈ且已l用了最新版本的MySQLQƈ且按照比较优化的方式q行了,那么最后的主要瓉一般在于单个服务的q接敎ͼ即一个数据库可以支持q发500个连接,最好也不要把应用用到这个地步,因ؓq发q接数过多数据库服务本n用于调度的线E的开销也会非常大了。所以如果应用允许的话:让一台机器多跑几个MySQL服务分担。将服务均衡的规划到多个MySQL服务端口上:比如app_1 ==> 3301 app_2 ==> 3302...app_9 ==> 3309。一?G内存的机器跑?0个MySQL是很正常的。让10个MySQLD承担1000个ƈ发连接效率要比让2个MySQLD承担1000个效率高的多。当Ӟq样也会带来一些应用编E上的复杂度Q?
使用单独的数据库服务器(不要让数据库和前台WEB服务抢内存)QMySQL拥有更多的内存就可能能有效的q行l果集的~存Q在前面的启动脚本中有一?O key_buffer=32M参数是用于缺省的8M索引~存增加?2MQ当然对于)
应用量使用PCONNECT和polling机制Q用于节省MySQL服务建立q接的开销Q但也会造成MySQLq发链接数过多(每个HTTPD都会对应一个MySQLU程Q;
表的横向拆分Q让最常被讉K?0%的数据放在一个小表里Q?0%的历史数据放在一个归表里(所谓:快慢表)Q数据中间通过定期“搬家”和定期删除无效数据来节省Q毕竟大部分应用Q比如论坛)讉K2个月前数据的几率会非常少Q而且价g不是很高。这样对于应用来说L在一个比较小的结果中进行数据选择Q比较有利于数据的缓存,不要指望MySQL中对单表记录条数?0万以上q有比较高的效率。而且有时候数据没有必要做那么_Q比如一个快表中查到了某个h发表的文章有60条结果,快表和慢表的比例?:20Q那么就可以单的估计q个Z共发表了1200。Google的搜索结果数也是一P对于很多上十万的l果敎ͼ后面很多的数字都是通过一定的法估计出来的?
数据库字D设计:表的U向拆分Q过渡范化)Q将所有的定长字段Qchar, int{)攑֜一个表里,所有的变长字段Qvarchar,text,blob{)攑֜另外一个表里,2个表之间通过主键兌Q这P定长字段表可以得到很大的优化Q这样可以用HEAP表类型,数据完全在内存中存取Q,q里也说明另外一个原则,对于我们来说Q尽量用定长字D可以通过I间的损失换取访问效率的提高。在MySQL4中也出现了支持外键和事务的InnoDBcd表,标准的MyISAM格式表和ZHASHl构的HEAP内存表,MySQL之所以支持多U表cdQ实际上是针对不同应用提供了不同的优化方式;
仔细的检查应用的索引设计Q可以在服务启动参数中加?--log-slow-queries[=file]用于跟踪分析应用瓉Q对于跟t服务瓶颈最单的Ҏ是用MySQL的status查看MySQL服务的运行统计和show processlist来查看当前服务中正在q行的SQLQ如果某个SQLl常出现在PROCESS LIST中,一。有可能被查询的此时非常多,二,里面有媄响查询的字段没有索引Q三Q返回的l果数过多数据库正在排序QSORTINGQ;所以做一个脚本:比如?U运行以下show processlist;把结果输出到文g中,看到底是什么查询在吃CPU?
全文索:如果相应字段没有做全文烦引的话,全文索将是一个非常消耗CPU的功能,因ؓ全文索是用不上一般数据库的烦引的Q所以要q行相应字段记录遍历。关于全文烦引可以参考一下基于Java的全文烦引引擎lucene的介l?
前台应用的记录缓存:比如一个经怋用数据库认证Q如果需要有更新用户最后登陆时间的操作Q最好记录更新后把用户攑ֈ一个缓存中Q设|?个小时后q期Q,q样如果用户?个小时内再次使用到登陆,q接从~存里认证,避免了过于频J的数据库操作?
查询优先的表应该可能ؓwhere和order by字句中的字段加上索引Q数据库更新插入优先的应用烦引越越好?
避免使用视图(viewport)与关联。视图viewport与关联都是ؓ了程序员处理相对复杂的数据管理提供方便的手段。万物有其利Q必有其弊。视囑֒兌提高了编E效率,都会较大地媄响数据库的访问效率(事实上ƈ不像一般资料说介绍的的那样高效Q,因此如果是web应用Q则一般不要用视图与兌?br />
字W串(varchar)比较变成数字?int)比较
每个pȝ都会有用L理,其中必然?늧Q密码,邮g{的字符串类型数据比较的问题。在数据库操作中Q字W串比较的效率是相当低下的。因此遇到字W串的比较,必须其转换为数字型比较?
具体做法是:在数据库表中增加相应的数字字D,比如 cNickname -> iNickNumber Q其?iNickNumber 的数gؓ cNickname ?哈希?/p>
数据库表table的字Dfield不要太多
本以为无需说明Q也是发C的朋友Qؓ了省事,一股脑把所有的相关字段都放在一个表中间。这样做的后果便是,E序写v来简单了Q运行效率下来了?
无论字段多少Q有两类字段是必ȝ立出ȝQ一是进E更新的字段Q比如文章的点击ơ数字段iShowQ二是二q制或者是text字段Q?br />
为每个数据库?table)讄 datetime 字段
在许多情况下Q很多的表是不需?datetime 字段用于保存旉的。本文的是你应该为每个表都设|?datetime 字段Q而且默认gؓ getdate()?
我们的经验是Qdatetime 是实敎ͼ占用字节不多Q在q行pȝl护Q远E备份等环节都会发挥意想不到的效果?/p>