[replyview]
在unix环境下在/etc/mysql/my.cnf 或者在mysql用户的home目录下面的my.cnf。
window环境中,如果c:根目录下有my.cnf文件则取该配置文件。当运行mysql的winmysqladmin.exe工具时候,该工具会把c:根目录下的my.cnf 命名为mycnf.bak。并在winnt目录下创建my.ini。mysql服务器启动时候会读该配置文件。所以可以把my.cnf中的内容拷贝到my.ini文件中,用my.ini文件作为mysql服务器的配置文件。
unix/linux环境下,就修改/etc/mysql/my.cnf然后/usr/local/mysql/share/mysql/mysql server restart就可以了。
我的测试环境:
操作系统:redhat AS 3
mysql:mysql-4.0.17.
A ip:192.168.0.90
B ip:192.168.0.99
A:设置
1.增加一个用户最为同步的用户帐号:
GRANT all privileges ON *.* TO backup@’192.168.0.99′ IDENTIFIED BY ‘1234’
B:设置
1.增加一个用户最为同步的用户帐号:
GRANT replication slave ON *.* TO backup@’192.168.0.90′ IDENTIFIED BY ‘1234’
说明:上面的all privileges在4.0版上应该为replication slave,也就是grant replication slave on……..在3.23上是file,也就是grant file on ……..但是我怕有别的麻烦,干脆权限全给好啦. 在进行如上设置之后,可以看出在192.168.37.189设定好并重启mysql以后,mysql会在数据目录(/var/lib/mysql)下生成一个master.info文件和relay-log.info,relay-log.index文件.如果要更改master服务器,则要删除掉这个文件,(即在更改了/etc/my.cnf中master相关信息)在my.cnf文件中重新配置,重新启动mysql,更改才会生效.
.主从模式:A->B
A为master
修改A mysql的my.ini文件。在mysqld配置项中加入下面配置:
server-id=1
log-bin
#设置需要记录log 可以设置log-bin=/var/mysqllog 设置日志文件的目录,
#其中mysqllog是日志文件的名称,mysql将建立不同扩展名,文件名为mysqllog的几个日志文件。
binlog-do-db=test #指定需要日志的数据库
这样,mysql会在数据目录放置test这个库的更新日志。等待备机来抓取
重起数据库服务。
用show master status 命令看日志情况。
B为slave
修改B mysql的my.ini文件。在mysqld配置项中加入下面配置:
server-id=2
master-host=192.168.0.90
master-user=backup #同步用户帐号
master-password=1234
master-port=3306
master-connect-retry=10 预设重试间隔10秒
replicate-do-db=test 告诉slave只做backup数据库的更新
log-bin
binlog-do-db=test
客户端会到服务器抓取test库的更新日志,来更新本地的test库
重起数据库
用show slave status看同步配置情况。
注意:由于设置了slave的配置信息,mysql在数据库目录下生成master.info
所以如有要修改相关slave的配置要先删除该文件。否则修改的配置不能生效。
双机互备模式。
如果在A加入slave设置,在B加入master设置,则可以做B->A的同步。
在A的配置文件中 mysqld 配置项加入以下设置:
master-host=192.168.0.99
master-user=backup
master-password=1234
replicate-do-db=backup
master-connect-retry=10
在B的配置文件中 mysqld 配置项加入以下设置:
log-bin
binlog-do-db=backup
注意:当有错误产生时*.err日志文件。同步的线程退出,当纠正错误后要让同步机制进行工作,运行slave start
重起AB机器,则可以实现双向的热备。
对于故障诊断,我的方法是都在在slave上.那么slave上是如何工作的呢?
Slave上Mysql的Replication工作有两个线程,I/O thread和SQL thread,I/O 的作用是从master 3306端口上把它的binlog取过来(master在被修改了任何内容之后,就会把修改了什么写到自己的binlog等待slave更新),然后写到本地的relay-log,而SQL thread则是去读本地的relay-log,再把它转换成本Mysql所能理解的东西,于是同步就这样一步一步的完成.决定I/O thread的是/var/lib/mysql/master.info,而决定SQL thread的是/var/lib/mysql/relay-log.info.
请注意,因为上边提到了binlog里的内容是改了什么东东,而不是改了以后是什么东东,所以在进行同步之前必须保证两个数据库是完全相同的,不然可能出错.打个比方来说.A机上有一个表里的元组为2,而操作是减一,则binlog只会记录减一这个操作,如果B机上没有,那么则无法得到同步,因为B机没有这个字段,就不知道减一是什么操作.
对于故障诊断,我的方法是都在slave(master/slave是相对的)的mysql(指客户端)里完成.
方法一:show slave status;
正确情况下应该同如下类似:
mysql> show slave status;
+————–+————-+————-+—————+——————– –+———————+———————-+—————+—————- ——-+——————+——————-+—————–+————— ——+————+————+————–+———————+———- ——-+
| Master_Host | Master_User | Master_Port | Connect_retry | Master_Log_File | Read_Master_Log_Pos | Relay_Log_File | Relay_Log_Pos | Relay_Master_Lo g_File | Slave_IO_Running | Slave_SQL_Running | Replicate_do_db | Replicate_igno re_db | Last_errno | Last_error | Skip_counter | Exec_master_log_pos | Relay_log _space |
+————–+————-+————-+—————+——————– –+———————+———————-+—————+—————- ——-+——————+——————-+—————–+————— ——+————+————+————–+———————+———- ——-+
| 192.168.0.90 | backup | 3306 | 10 | localserver1-bin.00 1 | 957 | server-relay-bin.005 | 613 | localserver1-bi n.001 | Yes | Yes | test | | 0 | | 0 | 957 | 613 |
+————–+————-+————-+—————+——————– –+———————+———————-+—————+—————- ——-+——————+——————-+—————–+————— ——+————+————+————–+———————+———- ——-+
1 row in set (0.00 sec)
上边的server1和Server是两台机器的主机名,所以真实情况应该有所分别,注意其中的YES|YES,这个是本地I/O线程及SQL线程的工作状态,要确
保都为YES,如果不是YES,请检查mysql是否正常运行.
方法二:show processlist;
如果正确,则应该如下所示:
mysql> show processlist;
+—-+————-+———–+——+———+————+———————————————————————–+——————+
| Id | User | Host | db | Command | Time | State | Info |
+—-+————-+———–+——+———+————+———————————————————————–+——————+
| 1 | system user | | NULL | Connect | 2511 | Waiting for master to send event | NULL |
| 2 | system user | | NULL | Connect | 4294906139 | Has read all relay log; waiting for the I/O slave thread to update it | NULL |
| 3 | root | localhost | test | Query | 0 | NULL | show processlist |
| 4 | root | localhost | test | Sleep | 1478 | | NULL |
+—-+————-+———–+——+———+————+———————————————————————–+——————+
4 rows in set (0.00 sec)
注意同标记过的字符类似,则是正确的,错误情况下应该是这个样子:
mysql> show processlist;
+—-+————-+———–+——+———+——+——————————————————————–
—+——————+
| Id | User | Host | db | Command | Time | State | Info |
+—-+————-+———–+——+———+——+——————————————————————–
—+——————+
| 4 | system user | | NULL | Connect | 454 | Reconnecting after a failed master event read | NULL |
| 5 | system user | | NULL | Connect | 454 | Has read all relay log; waiting for the I/O slave thread to update it | NULL |
| 7 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+—-+————-+———–+——+———+——+——————————————————————–
—+——————+
3 rows in set (0.00 sec)
当然如果这里的Reconnecting只是错误的一种,有可能是connecting,则表示正在连接,那么请检查:
1 master上的mysql daemon是否正常运行
2 master与slave的网络连接是否正常
3 my.cnf是否配置正确
4 在修改配置后是否删除过master.info?(删掉以后会自动再生成一个,别担心删掉),因为如果不删掉的话,那么则还是使用原来的配置
5 修改配置后有没有重新启动mysql daemon,重新启动过程后必须证实mysql已经正常启动
6 master上给slave及slave给master上分配的replication用户权限是否正确,master的主机名和dns设置
7 当前状况两台数据库是否完全相同.
方法三:show master status;
mysql> show master status;
+—————-+———-+————–+——————+
| File | Position | Binlog_do_db | Binlog_ignore_db |
+—————-+———-+————–+——————+
| Server1-bin.021 | 79 |test | |
+—————-+———-+————–+——————+
1 row in set (0.00 sec)
注意上边的这条,position不能为0,如果为0则表示有问题,请检查/etc/my.cnf中的server-id及是否打开log-bin
mysql> show processlist;
+—-+——–+———————+——+————-+——+———————————————————–
—–+——————+
| Id | User | Host | db | Command | Time | State | Info |
+—-+——–+———————+——+————-+——+———————————————————–
—–+——————+
| 1 | backup | 192.168.0.99:32996 | NULL | Binlog Dump | 284 | Has sent all binlog to slave; waiting for binlog to be
updated | NULL |
| 3 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+—-+——–+———————+——+————-+——+———————————————————–
—–+——————+
2 rows in set (0.00 sec)
如果master上不是这样,那么就应该是master的配置有问题啦.
方法四 查看错误日志
在 /usr/local/mysql/var下有个 localhost.err 文件,所有的错误都在其中被记录
对于大容量的数据库来说。用户当然想每一个时刻都备份所有数据,保证数据库的备份完整性,以免以外情况下,丢失的原数据库内容时候可以做到完全备份,把损失减低到最小。
一般来说,很多人都用直接把数据库或者表备份到一个文件,而且是每周一次或者是每天一次,当数据库或者是表非常大的时候,一次备份的时间就需要很长了,而且有时候也要人工操作。理想的方法当然是自动完成而且是不需要用户手工操作。下面介绍一个方法,实时备份(也叫增量备份)。
mysql4.0+版本和mysql5.0+版本操作有些不同。
1、对于mysql4.0+
首先在C:盘的windows文件夹里面找到my.ini配置文件。
里面的内容通常为如下:
#This File was made using the WinMySQLAdmin 1.4 Tool
#2007-4-11 15:17:00
#Uncomment or Add only the keys that you know how works.
#Read the MySQL Manual for instructions
[mysqld]
basedir=C:/mysql
#bind-address=192.168.1.5
datadir=C:/mysql/data
#language=C:/mysql/share/your language directory
#slow query log#=
#tmpdir#=
#port=3306
#set-variable=key_buffer=16M
log-update=f:\update
[WinMySQLadmin]
Server=C:/mysql/bin/mysqld-nt.exe
user=iouioupp(自定义的)
password=iouioupp(自定义的)
上面的配置文件说明了我的mysql数据库装在c:盘里面,接着我们只需要在[mysqld]项目下面增加一条语句就可以实现增量备份了。
#This File was made using the WinMySQLAdmin 1.4 Tool
#2007-4-11 15:17:00
#Uncomment or Add only the keys that you know how works.
#Read the MySQL Manual for instructions
[mysqld]
log-update=f:\update
basedir=C:/mysql
#bind-address=192.168.1.5
datadir=C:/mysql/data
#language=C:/mysql/share/your language directory
#slow query log#=
#tmpdir#=
#port=3306
#set-variable=key_buffer=16M
log-update=f:\update
[WinMySQLadmin]
Server=C:/mysql/bin/mysqld-nt.exe
user=iouioupp(自定义的)
password=iouioupp(自定义的)
请注意看紫红色的语句(它就是了)。
输入后,你可以重启电脑,或者启动任务管理器,把mysqld-nt终止进程。
前者重启电脑后会自动启动mysql服务器,后者需要你重新启动这个程序c:\mysql\bin\mysqladmin
然后,你就可以看到f:盘根目录下多了一个文件,名为update.00001,如果你一直使用着这个mysql服务器,那么这个文件就记录了mysql里面所有的数据库的表的变化(查询语句不包括)。
这种方法是最方便和最快捷的实时备份。
当然,你现在会想到如果mysql服务器真的出现意外时候,应该怎么还原呢?
看下面:
在你实行增量备份时,应该备份一次整个msyql的所有数据库(其实最简单的方法就是复制data文件夹)。
之后所有的变化都会出现在update.00001…………update.00002……………里面了,为什么有这么多的update.0000x呢?
因为每次重启电脑都会相应的增加一个更新的增量备份文件。
如果真的出现数据库意外时候,那就在msyql数据库里面删除所有资料,接着把原来复制出来的data文件夹粘贴到原来位置,接着就是执行所有的update.0000x文件。最后就完成了。
你还可以每一次关机之前都备份一次mysql里面的所有数据库,那么当出现意外时候,只需要还原最后一次的update.0000x文件就行了。
还原update.0000x文件用以下语句:mysqladmin -u -p flush-logs