最近在学习关于mysql的数据库复制方面的东东,搜集了一些资料,整理如下:
1:mysql手动复制数据库技巧
2:MYSQL 复制范例详解
3:MYSQL数据同步备份复制电脑网络
4:MySql数据库同步复制;mysql数据复制方案
5:MySQL异步复制备忘
6:mysql的root口令忘记了怎么办?
7:【翻译】MYSQL数据库复制
mysql数据库复制技巧集锦
1:mysql手动复制数据库技巧
引用源博文网址: http://blog.ccidnet.com/blog/ccid/do_showone/tid_49707.html
我工作的环境中,有一个开发的MYSQL数据库,一个处于生产环境的MYSQL数据库。我不定期的从生产环境复制数据到我哦大开发环境。以前,我都是导出到脚本,然后再导入。其实,利用‘mysqldump’命令以及管道操作符,还有‘mysql’可以一步完成。
命令是:
mysqldump wap --opt | mysql wap -h 221.218.9.41
我下面对这个命令的几个部分说明一下。mysqldump wap --opt,是把名为wap的这个数据库导出到标准输出。并且使用--opt选项。 --opt 等效于--add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, 和--disable-keys。这在完全导出然后完全导入数据的时候,非常有用。在这里,我没有指定登陆帐号和密码,因为我的配置文件my.cnf已经指定了。
然后是一个管道操作符。它的作用是把第二个的输出转为第二个命令的输出。在这里,我没有指定登陆帐号和密码,因为我的配置文件my.cnf已经指定了。
第三个命令,则是我们常用的mysql命令行客户端,-h选项指定了目标机器。
希望我写的这个小技巧,能够对你有用。不过,你前晚得小心了——别弄反了导入和导出的方向。
--------------------------------------------------------------------------------
2:MYSQL 复制范例详解
http://www.cublog.cn/u/15758/showart.php?id=181596
MYSQL 复制范例详解
首先准备主从服务器
主A-192.168.100.1
从B-192.168.100.2
上面安装尽量为相同版本的MYSQL
如果使用不同版本时,则从库的MYSQL版本可以高于主库,反之不然
1.配置主库/etc/my.cnf
my.cnf中要有一下两句:
在[mysqld]添加如下参数
server-id = 1
log-bin
一般来说,my.cnf应该在/etc下面,如果是rpm安装,也可以在/var/lib/mysql下面。
2.锁主库表
mysql> flush tables with read lock;
注意,锁表之后,所有对于该数据库的写操作都将被禁止。
因此应该已经确切准备好下一步的操作之后,再按回车执行建议开两个窗口,
一个用于mysql,一个用于命令行
3. 备份主库数据文件
cd /dateDirectory #数据文件存放目录
cp -r mysql mysql_0227
上面假设是rpm缺省安装。在文件复制过程中,就可以进行下一步了。
[编辑]记录二进制文件位置
回到刚才的mysql窗口
mysql> show master status;
得到如下结果:
+---------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| zx-bin.000002 | 98 | | |
+---------------+----------+--------------+------------------+
[编辑]解锁
待文件复制完成,就可以解锁了
mysql> unlock tables;
此时,主库已经恢复正常工作。以后的操作不会影响master的工作了。
[编辑]在主库生成复制用户权限
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replman'@'%' IDENTIFIED BY 'xplus';
mysql> flush privileges;
[编辑]复制数据文件到从库
替换已经存在的从库data目录,并
chown -Rf mysql:mysql mysql
修改数据文件属性
[编辑]修改从库的my.cnf
方法同步骤1,但server_id要与其它服务器不同
[编辑]启动从库
重新启动从库
mysql >CHANGE MASTER TO
MASTER_HOST='192.168.100.1',
MASTER_USER='replman',
MASTER_PASSWORD='xplus',
MASTER_LOG_FILE='zx-bin.000002',
MASTER_LOG_POS=98;
其中,MASTER_HOST是主库IP,用户名密码在上面生成主库复制用户的命令中,日志文件名和位置在show master status步骤中得到
[编辑]启动复制
mysql >start slave
mysql >show slave status
BY:IORI
--------------------------------------------------------------------------------
3:MYSQL数据同步备份复制电脑网络
一帅
http://www.bloghome.cn/posts/25330
发表于2006-04-20 22:17
设置 MySql 数据同步
mysql从3.23.15版本以后提供数据库复制功能。利用该功能可以实现两个数据库同步,主从模式,互相备份模式的功能
数据库同步复制功能的设置都在mysql的设置文件中体现。mysql的配置文件(一般是my.cnf),在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服务器的配置文件。
设置方法:
设置范例环境:
操作系统:window2000 professional
mysql:4.0.4-beta-max-nt-log
A ip:10.10.10.22
B ip:10.10.10.53
A:设置
1.增加一个用户最为同步的用户帐号:
GRANT FILE ON *.* TO backup@'10.10.10.53' IDENTIFIED BY ‘1234’
2.增加一个数据库作为同步数据库:
create database backup
B:设置
1.增加一个用户最为同步的用户帐号:
GRANT FILE ON *.* TO backup@'10.10.10.22' IDENTIFIED BY ‘1234’
2.增加一个数据库作为同步数据库:
create database backup
主从模式:A->B
A为master
修改A mysql的my.ini文件。在mysqld配置项中加入下面配置:
server-id=1log-bin#设置需要记录log 可以设置log-bin=c:mysqlbakmysqllog 设置日志文件的目录,#其中mysqllog是日志文件的名称,mysql将建立不同扩展名,文件名为mysqllog的几个日志文件。binlog-do-db=backup #指定需要日志的数据库
重起数据库服务。
用show master status 命令看日志情况。
B为slave
修改B mysql的my.ini文件。在mysqld配置项中加入下面配置:
server-id=2master-host=10.10.10.22master-user=backup
#同步用户帐号
master-password=1234master-port=3306master-connect-retry=60
预设重试间隔60秒replicate-do-db=backup 告诉slave只做backup数据库的更新
重起数据库
用show slave status看同步配置情况。
注意:由于设置了slave的配置信息,mysql在数据库目录下生成master.info,所以如有要修改相关slave的配置要先删除该文件。否则修改的配置不能生效。
双机互备模式。
如果在A加入slave设置,在B加入master设置,则可以做B->A的同步。
在A的配置文件中 mysqld 配置项加入以下设置:
master-host=10.10.10.53master-user=backupmaster-password=1234replicate-do-db=backupmaster-connect-retry=10
在B的配置文件中 mysqld 配置项加入以下设置:
log-bin=c:mysqllogmysqllogbinlog-do-db=backup
注意:当有错误产生时*.err日志文件。同步的线程退出,当纠正错误后要让同步机制进行工作,运行slave start
重起AB机器,则可以实现双向的热备。
测试:
向B批量插入大数据量表AA(1872000)条,A数据库每秒钟可以更新2500条数据。
--------------------------------------------------------------------------------
4:MySql数据库同步复制
摘自 longrujun 的 Blog (作者Blog: http://blog.csdn.net/longrujun/ )
关键字 MySql数据库同步复制
该功能可以实现两个数据库同步,主从模式,互相备份模式的功能。
数据库同步复制功能的设置都在mysql的设置文件中体现。mysql的配置文件(windows下为my.ini,Unix/Linux下为my.cnf)
1、实施环境:
操作系统:2台linux AS 4[up3]
mysql:mysql-4.1.15.tar.gz
SvrA ip:192.168.1.10
SvrB ip:192.168.1.11
2、配置方法
Demo 1:主从模式[Master->Slave]:A->B
=====step 1:分别在SvrA、SvrB上配置同步DB及Account=====
Step A:SvrA上配置
1.增加一个用户最为同步的用户帐号:
GRANT FILE ON *.* TO backup.user@'192.168.1.11' IDENTIFIED BY ‘rsync.mysql’;
2.增加一个数据库作为同步数据库:
create database backup;
Step B:SvrB上配置
1.增加一个用户最为同步的用户帐号:
GRANT FILE ON *.* TO backup.user@'192.168.1.10' IDENTIFIED BY ‘rsync.mysql’;
2.增加一个数据库作为同步数据库:
create database backup;
====step 2:配置Master、Slave参数======
主从模式:A->B即 SvrA为master ,SvrB为slave
1、修改SvrA 中mysql的my.cnf文件。在mysqld配置项中加入下面配置:
server-id=1
log-bin
binlog-do-db=backup
注
og-bin #设置需要记录log 可以设置log-bin=/Data/logs/mysqllog 设置日志文件的目录[其中mysqllog是日志文件的名称,mysql将建立不同扩展名,文件名为mysqllog的几个日志文件]。
binlog-do-db=backup #指定需要日志的数据库
配置完后重起数据库服务。
用show master status 命令看日志情况。
2、修改SvrB中 mysql的my.cnf文件。在mysqld配置项中加入下面配置:
server-id=2
master-host=192.168.1.10
master-user=backup.user #同步用户帐号
master-password=rsync.mysql
master-port=3306
master-connect-retry=10 预设重试间隔10秒
replicate-do-db=backup 告诉slave只做backup数据库的更新
配置完后重起数据库
用show slave status看同步配置情况。
注意:由于设置了slave的配置信息,mysql在数据库目录下生成master.info
所以如有要修改相关slave的配置要先删除该文件。否则修改的配置不能生效。
Demo 2、双机互备模式。
如果在A加入slave设置,在B加入master设置,则可以做B->A的同步。
在A的配置文件中 mysqld 配置项加入以下设置:
master-host=192.168.1.11
master-user=backup.user
master-password=rsync.mysql
replicate-do-db=backup
master-connect-retry=10
在B的配置文件中 mysqld 配置项加入以下设置:
log-bin
binlog-do-db=backup
注意:当有错误产生时*.err日志文件。同步的线程退出,当纠正错误后要让同步机制进行工作,运行slave start
重起AB机器,则可以实现双向的热备。
注:
1、 在处理Slave中MYSQL,默认是启用server-id=1,所以将其修改为server-id=2
2、 在测试时,可以测试一下互连状态
Mysql –h ServerA/B –u backup.user –p
3、 关于Master->多个Slave,可以参考MYSQL官方文档
推荐1、 http://dev.mysql.com/doc/
2、 http://www.mysql.com/why-mysql/white-papers/
3、 http://www.mysql.com/products/database/cluster/
--------------------------------------------------------------------------------
4:mysql数据复制方案
[来自jollr.com]
2003年12月15日 12:00 1楼
现在找一个提供免费MYSQL的网站真不容易,即便找到了也不提供file权限,管理数据怎么办?用phpMyAdmin在线一条一条的插入?如果想搬家呢?
所以本人在一开始便设计了一套数据管理方案:
在本地将数据保存成TXT文件,FTP上传,PHP程序将其逐行读出,写入MYSQL。导出时反之。
日前偶上OSO论谈,看到有网友正苦于此事,现将源代码公布,供大家分享。如有漏洞,望指正。
由于时间关系本人并没有设计出一个通用的程序,只是举例说明。
mysql 表名:tbn
字段:
ssj: date
ssm: varchar(8)
bos: enum(\"s\",\"b\",\"f\") default s
这里只设计了三个字段,各有其特点,其它类型的字段可参照设计。
tbn.txt文件:
ssj ssm bos
------------------------------------
2001-04-05 record1 2
2001-04-06 record2 1
2001-04-08 record3 3
------------------------------------
为了导入导出TXT的一致性,将mysql的ENUM字段转存TXT文件时以索引号代替,这样便于修改、更新记录
1对应enum字段的s
2对应enum字段的b
3对应enum字段的f
字段间为TAB符
txt2db.php
<?
require \"connecthost.inc.php\";//连接到MYSQL服务器,可别照抄
$tbn=$tbn;//mysql表名
$rf=file(\"$tbn.txt\");//file是一个将TXT文件按行直接读入数组的函数
$rfs=count($rf);
for ($k=0;$k<$rfs;$k++) {
$exstr=explode(chr(9),$rf[$k]);//EXPLODE是一个字符串分割函数,CHR(9)为TAB符
$ins=mysql_query(\"insert into $tbn (ssj,ssm,bos) values(“$field[0]“,“$field[1]“,$field[2])\");
$inss=$inss+$ins;
}
echo $inss.\"个记录被插入<BR>\";
mysql_close();
?>
db2txt.php
<?
require \"connecthost.inc.php\";
$tbn=$tbn;
//下面先得到ENUM字段的所有值及对应索引号,
//如果不明白,在DOS下运行一下show columns from $tbn like “bos“,分析一下返回的结果
$fea=mysql_query(\"show columns from $tbn like “bos“\");
$fea_s=mysql_fetch_array($fea);
$fea_s2=$fea_s[“Type“];
$bosset=explode(\",\",substr($fea_s2,5,(strlen($fea_s)-6)));
$bossets=count($bosset);
for ($j=0;$j<$bossets;$j++){
$bosset[$j]=substr($bosset[$j],1,strlen($bosset[$j])-2);
}
$qh=mysql_query(\"select * from $tbn\");
$fp=fopen(\"$tbn.txt\",\"w\"); //打开一个用于写入的文件
while ($row=mysql_fetch_array($qh)) {
for ($i=0;$i<$bossets;$i++){
if ($row[2]==$bosset[$i]){
$bosdm=$i+1; //+1 because mysql enum index from 1,php array index from 0
break;
}//找到当前ENUM字段对索引号
}
$record=$row[0].chr(9).$row[1].chr(9).$bosdm.chr(13).chr(10);
//chr(9)为TAB符,chr(13).chr(10)为回车并换行
$sl=strlen($record);
$fps=fputs($fp,$record,$sl);//写入文件
}
echo \"$tbn trans over \".$fps;
fclose($fp);
mysql_close();
?>
当然,要先用FTP工具把TXT文件的属性改为可写,才能写入,想必这不用我说。
http://zjss.bbs.us/?act=program&rid=80046
--------------------------------------------------------------------------------
5:MySQL异步复制备忘
http://blog.sina.com.cn/u/4b0710d8010007eo
一、异步复制基本原理
从MySQL3.23.15以后,MySQL支持单向的异步复制。也就是说,1台MySQL服务器充当Master(主库),1台或多台MySQL服务器充当Slaves(从库),数据从Master向Slaves进行异步复制。注意,这种复制是异步的,有别于MySQL的同步复制实现(这种实现称做MySQL集群,MySQL Cluster)。
当主库有更新的时候,主库会把更新操作的SQL写入二进制日志(Bin log),并维护一个二进制日志文件的索引,以便于日志文件轮回(Rotate)。在从库启动异步复制的时候,从库会开启两个I/O线程,其中一个线程连接主库,要求主库把二进制日志的变化部分传给从库,并把传回的日志写入本地磁盘。另一个线程则负责读取本地写入的二进制日志,并在本地执行,以反映出这种变化。较老的版本在复制的时候只启用一个I/O线程,实现这两部分的功能。
有几个关键性的地方需要注意:
- 主库必须启用Bin log,主库和从库必须有唯一的Server Id
- 从库必须清楚了解从主库的哪一个Bin log文件的哪一个偏移位置起开始复制
- 从库可以从主库只复制指定的数据库,或者数据库的某些数据表
- 主库和从库的数据库名称可以不一样,不过还是推荐使用一样的名称
- 主库和从库的MySQL版本需保持一致
二、如何配置MySQL复制
我们在同一台机器做实验,1个主库,两个从库。基本情况如下:
- 主库
端口号:3308
数据目录:/var/lib/dbmaster
配置文件:/var/lib/dbmaster/my.cnf
- 从库1
端口号:3309
数据目录:/var/lib/dbslave1
配置文件:/var/lib/dbslave1/my.cnf
- 从库2
端口号:3310
数据目录:/var/lib/dbslave2
配置文件:/var/lib/dbslave2/my.cnf
待同步的数据库名位research,我们的目标是实现research从主库复制到两个从库。
(1) 主库的配置
首先,建立数据目录位置。
# mkdir /var/lib/dbmaster
然后,编辑主库的配置文件。
# vi /var/lib/dbmaster/my.cnf
写入以下内容:
[mysqld]
datadir=/var/lib/dbmaster
socket=/var/lib/dbmaster/mysql.sock
port=3308
old_passwords=1
log-bin
server-id=1270000000013308
binlog-do-db=research
[mysqld_safe]
err-log=/var/lib/dbmaster/mysqld.log
pid-file=/var/lib/dbmaster/mysqld.pid
[mysql.server]
user=mysql
basedir=/var/lib
运行下面的命令,初始化数据目录。
# mysql_install_db --defaults-file=/var/lib/dbmaster/my.cnf
# chown -R mysql.mysql /var/lib/dbmaster
注意,我们为MySQL服务单独建立了用户mysql和用户组mysql。初始化数据目录后,必须把所有者改为mysql。
现在,我们启动主库服务,在主库创建数据库research,并创建一个数据表test,然后插入一条记录。
# mysqld_safe --defaults-file=/var/lib/dbmaster/my.cnf &
# mysql -uroot -S /var/lib/dbmaster/mysql.sock
mysql> create database research;
mysql> use research;
mysql> create table test (name varchar(20));
mysql> insert into test set name=\"explorer\";
mysql> exit;
现在,我们配置主库,让从库从当前点开始复制。
首先需要配置一个用于复制的MySQL帐号,用于从库的连接。
我们锁定整个主库,避免主库数据更新。
然后我们查看主库的状态,记录下Bin log的文件名称(下例为localhost-bin.000003)和位置偏移(下例为79)。
# mysql -uroot -S /var/lib/dbmaster/mysql.sock
mysql> GRANT REPLICATION SLAVE ON *.*
-> TO 'repl'@'127.0.0.1' IDENTIFIED BY 'slavepass';
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
+----------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------------+----------+--------------+------------------+
| localhost-bin.000003 | 79 | research | |
+----------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
然后我们另开一个终端开始下一步操作,注意保持原终端不要退出mysql。
(2) 从库配置
首先,建立数据目录位置。
# mkdir /var/lib/dbslave1
然后,编辑主库的配置文件。
# vi /var/lib/dbslave1/my.cnf
写入以下内容:
[mysqld]
datadir=/var/lib/dbslave1
socket=/var/lib/dbslave1/mysql.sock
port=3309
old_passwords=1
log-bin
server-id=1270000000013309
log-slave-updates
[mysqld_safe]
err-log=/var/lib/dbslave1/mysqld.log
pid-file=/var/lib/dbslave1/mysqld.pid
[mysql.server]
user=mysql
basedir=/var/lib
运行下面的命令,初始化数据目录。
# mysql_install_db --defaults-file=/var/lib/dbslave1/my.cnf
# chown -R mysql.mysql /var/lib/dbslave1
# cp -ar /var/lib/dbmaster/research /var/lib/dbslave1
上面最后一条命令把主库的research数据库拷贝到了从库,在主库加了读锁的情况下这种拷贝是安全的。
现在,我们启动从库服务,启用主库到从库的复制。
# mysqld_safe --defaults-file=/var/lib/dbmaster/my.cnf &
# mysql -uroot -S /var/lib/dbslave1/mysql.sock
mysql> CHANGE MASTER TO
-> MASTER_HOST='127.0.0.1',
-> MASTER_PORT=3308,
-> MASTER_USER='repl',
-> MASTER_PASSWORD='slavepass',
-> MASTER_LOG_FILE='localhost-bin.000003',
-> MASTER_LOG_POS=79;
mysql> START SLAVE;
mysql> EXIT;
另一个从库配置与此类似。
(3) 同步测试
转入我们在(1)中打开的终端,此时我们还在mysql的提示符下。运行下面的SQL解锁并插入一条新记录。
mysql> UNLOCK TABLES;
mysql> use research;
mysql> insert into test set name=\"mars\";
mysql> exit;
如果正常的话应该可以在两个从库看到mars这条记录了。
三、异步复制的进一步分析
启用MySQL异步复制后,主库为每一个从库打开了一个连接,这可通过show processlist这条SQL看出来。
mysql> show processlist G
*************************** 1. row ***************************
Id: 1
User: repl
Host: localhost.localdomain:40245
db: NULL
Command: Binlog Dump
Time: 3404
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
*************************** 2. row ***************************
Id: 2
User: repl
Host: localhost.localdomain:40246
db: NULL
Command: Binlog Dump
Time: 3404
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
*************************** 3. row ***************************
Id: 4
User: root
Host: localhost.localdomain:38327
db: NULL
Command: Query
Time: 0
State: NULL
Info: show processlist
3 rows in set (0.00 sec)
线程Id为1和2的是为从库开的连接,比较重要的信息是State,描述了当前同步状态。
从库会打开两个线程,同样我们也可以通过这个SQL语句看出来。
mysql> show processlist G
*************************** 1. row ***************************
Id: 1
User: system user
Host:
db: NULL
Command: Connect
Time: 3575
State: Waiting for master to send event
Info: NULL
*************************** 2. row ***************************
Id: 2
User: system user
Host:
db: NULL
Command: Connect
Time: 3575
State: Has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
*************************** 3. row ***************************
Id: 3
User: root
Host: localhost.localdomain:47107
db: NULL
Command: Query
Time: 0
State: NULL
Info: show processlist
3 rows in set (0.00 sec)
其中线程Id为1的是复制线程,连接远程的主库,复制Bin Log到本地磁盘。线程Id为2的是执行线程,负责执行本地磁盘同步过来的Bin Log。同样State信息是关键信息。
关于State的详细说明请参考 http://dev.mysql.com/doc/refman/4.1/en/master-thread-states.html 以及 http://dev.mysql.com/doc/refman/ ... -thread-states.html 。
从库中关于复制有这么一些文件是需要注意的:
# ls /var/lib/dbslave1
ibdata1 localhost-bin.000007 localhost-bin.000016 mysqld.log
ib_logfile0 localhost-bin.000008 localhost-bin.000017 mysqld.pid
ib_logfile1 localhost-bin.000009 localhost-bin.000018 mysql.sock
localhost-bin.000001 localhost-bin.000010 localhost-bin.index relay-log.info
localhost-bin.000002 localhost-bin.000011 localhost-relay-bin.000012 research
localhost-bin.000003 localhost-bin.000012 localhost-relay-bin.index test
localhost-bin.000004 localhost-bin.000013 master.info
localhost-bin.000005 localhost-bin.000014 my.cnf
localhost-bin.000006 localhost-bin.000015 mysql
*-reloay-bin.* 从主库同步过来的Bin log文件
master.info 主库帐号信息和同步信息
relay-log.info 跟踪执行同步过来的Bin log的执行情况
mysqld.log 数据库日志,排错的时候相当有用
四、其他工具
netstat命令查看当前监听的网络端口,我们可以凭此判断MySQL端口是否开启。
# nestat -nlt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:39137 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:3308 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:3309 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:3310 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 :::6000 :::* LISTEN
mysqlbinlog工具可查看二进制的Binlog文件,这对于判断同步复制点很有用处。
# mysqlbinlog localhost-relay-bin.000012
...
mysqldump命令可用于数据复制前主从库之间同步数据(在上节中我们是通过直接拷贝文件实现的)。
参考资料:
http://dev.mysql.com/doc/refman/4.1/en/replication.html
--------------------------------------------------------------------------------
6:mysql的root口令忘记了怎么办?
数据库 /linuxman 发表于2004-11-28 13:59
这真是糟糕的事情:-
停止mysql服务:/etc/init.d/mysql stop
这样重启mysqld:/usr/bin/mysqld_safe --skip-grant-tables &
然后执行mysql -h localhost mysql可以直接进入。
执行:use mysql; select * from user; 有没有你记得口令的用户?如果有的话,执行:update user set Password=''password'' where User=''user'' and Host=''localhost''; 上面user是你记得口令的用户,password是用户user的口令。这样,root的口令就变成password啦:-)
如果所有用户的口令都不记得了(真是糟糕!),那么执行:
grant all on *.* to root@localhost identified by ''newpassword''; flush privileges;
或者:
update user SET password=password(''new_password'') WHERE user=''root'';
重新启动mysql: /etc/init.d/mysql restart
--------------------------------------------------------------------------------
7:【翻译】MYSQL数据库复制
日期:2007-01-04
作者:whsong
来源: http://www.pc51.net/data/MySQL/2007-01-04/2599.html
尽量确保所安装的MySQL版本是最新版本
4.1.x和4.0.x是相同的binary log format,所以他们中的任意两个复制都不会有问题
下面给出了一个兼容性列表:
Master
3.23.33 and up Master
4.0.3 and up or any 4.1.x Master
5.0.0
Slave 3.23.33 and up yes no no
Slave 4.0.3 and up yes yes no
Slave 5.0.0 yes yes yes
1). 在Master Server上建立一个用于Slave Server同步数据库用的帐号,这个帐号要被给予“REPLICATION SLAVE”权限,假设你的Slave Server所在的域为Slave.com,同步用用户名为repl,密码为slavepass,用如下语句在Master Server上建立用户并授权:
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.Slave.com' IDENTIFIED BY 'slavepass'; //这允许复制所有的数据库,也可以单独制定数据库
2). 如果数据库只是用了MyISAM表(从3.23.0开始,MyISAM就是MySQL数据表的默认格式了),用“FLUSH TABLES WITH READ LOCK;”语句刷新所有的表并禁止写语句。不要退出你执行上述语句的客户端,如果退出,语句执行就会结束。
3). 为Master Server上的数据做一个快照,最简单的办法就是把数据目录打成一个压缩包。Linux下使用tar命令,Windows下可以使用WinRAR。如果只复制单个数据库就只需打包那个数据库目录就可以了。将打包文件拷贝到Slave Server上,解压缩到数据库目录,如果不想Slave Server上的mysql数据库被覆盖,将压缩包里面的mysql剔除再解压缩到数据库目录。压缩包解压缩前不要包含任何日志文件,或者master.info、relay-log.info。
4). 当“FLUSH TABLES WITH READ LOCK”生效后,在Master Server上执行“SHOW MASTER STATUS;”,“File”栏下记录的是日志的名字,“Position”栏记录的是偏移量,记下日志名字和偏移量,以后要用到。然后执行“UNLOCK TABLES;”,启用写语句。
如果你使用了InnoDB表,最好的方法是使用InnoDB Hot Backup工具,可以去 http://www.innodb.com/manual.php 查看具体信息。
如果没有使用InnoDB Hot Backup工具,最快的制作InnoDB表快照的方法就是关掉Master Server,拷贝InnoDB数据文件、日志文件、表定义文件。在关闭Master Server之前,你需要记录日志文件名字和偏移量,使用下面的语句:
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
记录完以后,直接关闭Server,不要运行“UNLOCK TABLES;”,以保证快照对应的日志名字和偏移量没有改变。
mysqladmin -u root shutdown //关闭Server
注:有一个可以同时应用于MyISAM和InnoDB表的方法——做Master的SQL dump。
在Master Server上执行“mysqldump --master-data”,然后在Slave Server上导入在Master Server上导出的数据文件,但是这种方法慢。
如果Master Server以前是以 “without --log-bin enabled”运行的,那么通过“SHOW MASTER STATUS”查看的日志文件和偏移量将是空的,mysqldump也会是空的。这样,当一会要制定Slave的log file and position时,就使用空字符串“’’”和4。
5). 确保Master Server上的my.cnf文件中[mysqld]块包括一个log-bin选项和server-id=master_id选项,并且master_id是一个位于1 to 232 – 1之间的正数。
[mysqld]
log-bin
server-id=1
如果没有,添加并重启Server
6). 关闭Slave Server上的MySQL,在my.cnf活my.ini中添加
[mysqld]
server-id=slave_id
slave_id也是一个位于1 to 232 – 1之间的正数,但是不能和master_id一样。如果不止一台Slave Server,则每一台Slave Server的slave_id不能相同。
启动Slave Server上的MySQL之前,确保从Master Server上备份的数据已经放到Slave Server上MySQL的数据库目录中。并确认权限设置正确。如果使用mysqldump备份的,先启动Slave Server。
7). 启动Slave Server上的MySQL。如果以前设置过复制,则使用--skip-slave-start选项,确保启动后不立即连接Master Server。也可以使用--log-warnings选项,当出现问题时可以获得更多的信息。
如果使用mysqldump备份数据的,导入数据:“mysql -u root -p < dump_file.sql”
8). 在Slave Server上执行下面的语句:
mysql> CHANGE MASTER TO
-> MASTER_HOST='master_host_name',
-> MASTER_USER='replication_user_name',
-> MASTER_PASSWORD='replication_password',
-> MASTER_LOG_FILE='recorded_log_file_name',
-> MASTER_LOG_POS=recorded_log_position;
替换选项中的值为实际值。
下面是选项长度限制:
MASTER_HOST 60
MASTER_USER 16
MASTER_PASSWORD 32
MASTER_LOG_FILE 255
9). 启动Slave线程:
mysql> START SLAVE;
至此,应该可以实现数据库的复制了。
其他问题:
如果忘记设置Master Server的server-id的值,Slave Server就不能连接到Master Server
如果忘记设置Slave Server的server-id的值,你将得到下面的错误提示:
Warning: You should set server_id to a non-0 value if master_host is set; We force the server id to 2, but this MySQL server will not act as a slave.
如果出现其他原因导致不能同步,你可以在Slave的错误日志里看到错误提示。
当Slave Server开始复制数据库时,你可以在data directory中发现master.info和relay-log.info,Slave通过这两个文件来跟踪Master的binary log。不要删除和编辑这两个文件,尽量使用“CHANGE MASTER TO”语句。
master.info会覆盖一些在命令行制定的选型和在my.cnf中的选项。
当配置好一台Slave Server后,可以使用同样的方法配置其他的Slave Server,不需要重新备份Master Server的数据库,使用同一个即可。
1:mysql手动复制数据库技巧
2:MYSQL 复制范例详解
3:MYSQL数据同步备份复制电脑网络
4:MySql数据库同步复制;mysql数据复制方案
5:MySQL异步复制备忘
6:mysql的root口令忘记了怎么办?
7:【翻译】MYSQL数据库复制
mysql数据库复制技巧集锦
1:mysql手动复制数据库技巧
引用源博文网址: http://blog.ccidnet.com/blog/ccid/do_showone/tid_49707.html
我工作的环境中,有一个开发的MYSQL数据库,一个处于生产环境的MYSQL数据库。我不定期的从生产环境复制数据到我哦大开发环境。以前,我都是导出到脚本,然后再导入。其实,利用‘mysqldump’命令以及管道操作符,还有‘mysql’可以一步完成。
命令是:
mysqldump wap --opt | mysql wap -h 221.218.9.41
我下面对这个命令的几个部分说明一下。mysqldump wap --opt,是把名为wap的这个数据库导出到标准输出。并且使用--opt选项。 --opt 等效于--add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, 和--disable-keys。这在完全导出然后完全导入数据的时候,非常有用。在这里,我没有指定登陆帐号和密码,因为我的配置文件my.cnf已经指定了。
然后是一个管道操作符。它的作用是把第二个的输出转为第二个命令的输出。在这里,我没有指定登陆帐号和密码,因为我的配置文件my.cnf已经指定了。
第三个命令,则是我们常用的mysql命令行客户端,-h选项指定了目标机器。
希望我写的这个小技巧,能够对你有用。不过,你前晚得小心了——别弄反了导入和导出的方向。
--------------------------------------------------------------------------------
2:MYSQL 复制范例详解
http://www.cublog.cn/u/15758/showart.php?id=181596
MYSQL 复制范例详解
首先准备主从服务器
主A-192.168.100.1
从B-192.168.100.2
上面安装尽量为相同版本的MYSQL
如果使用不同版本时,则从库的MYSQL版本可以高于主库,反之不然
1.配置主库/etc/my.cnf
my.cnf中要有一下两句:
在[mysqld]添加如下参数
server-id = 1
log-bin
一般来说,my.cnf应该在/etc下面,如果是rpm安装,也可以在/var/lib/mysql下面。
2.锁主库表
mysql> flush tables with read lock;
注意,锁表之后,所有对于该数据库的写操作都将被禁止。
因此应该已经确切准备好下一步的操作之后,再按回车执行建议开两个窗口,
一个用于mysql,一个用于命令行
3. 备份主库数据文件
cd /dateDirectory #数据文件存放目录
cp -r mysql mysql_0227
上面假设是rpm缺省安装。在文件复制过程中,就可以进行下一步了。
[编辑]记录二进制文件位置
回到刚才的mysql窗口
mysql> show master status;
得到如下结果:
+---------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| zx-bin.000002 | 98 | | |
+---------------+----------+--------------+------------------+
[编辑]解锁
待文件复制完成,就可以解锁了
mysql> unlock tables;
此时,主库已经恢复正常工作。以后的操作不会影响master的工作了。
[编辑]在主库生成复制用户权限
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replman'@'%' IDENTIFIED BY 'xplus';
mysql> flush privileges;
[编辑]复制数据文件到从库
替换已经存在的从库data目录,并
chown -Rf mysql:mysql mysql
修改数据文件属性
[编辑]修改从库的my.cnf
方法同步骤1,但server_id要与其它服务器不同
[编辑]启动从库
重新启动从库
mysql >CHANGE MASTER TO
MASTER_HOST='192.168.100.1',
MASTER_USER='replman',
MASTER_PASSWORD='xplus',
MASTER_LOG_FILE='zx-bin.000002',
MASTER_LOG_POS=98;
其中,MASTER_HOST是主库IP,用户名密码在上面生成主库复制用户的命令中,日志文件名和位置在show master status步骤中得到
[编辑]启动复制
mysql >start slave
mysql >show slave status
BY:IORI
--------------------------------------------------------------------------------
3:MYSQL数据同步备份复制电脑网络
一帅
http://www.bloghome.cn/posts/25330
发表于2006-04-20 22:17
设置 MySql 数据同步
mysql从3.23.15版本以后提供数据库复制功能。利用该功能可以实现两个数据库同步,主从模式,互相备份模式的功能
数据库同步复制功能的设置都在mysql的设置文件中体现。mysql的配置文件(一般是my.cnf),在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服务器的配置文件。
设置方法:
设置范例环境:
操作系统:window2000 professional
mysql:4.0.4-beta-max-nt-log
A ip:10.10.10.22
B ip:10.10.10.53
A:设置
1.增加一个用户最为同步的用户帐号:
GRANT FILE ON *.* TO backup@'10.10.10.53' IDENTIFIED BY ‘1234’
2.增加一个数据库作为同步数据库:
create database backup
B:设置
1.增加一个用户最为同步的用户帐号:
GRANT FILE ON *.* TO backup@'10.10.10.22' IDENTIFIED BY ‘1234’
2.增加一个数据库作为同步数据库:
create database backup
主从模式:A->B
A为master
修改A mysql的my.ini文件。在mysqld配置项中加入下面配置:
server-id=1log-bin#设置需要记录log 可以设置log-bin=c:mysqlbakmysqllog 设置日志文件的目录,#其中mysqllog是日志文件的名称,mysql将建立不同扩展名,文件名为mysqllog的几个日志文件。binlog-do-db=backup #指定需要日志的数据库
重起数据库服务。
用show master status 命令看日志情况。
B为slave
修改B mysql的my.ini文件。在mysqld配置项中加入下面配置:
server-id=2master-host=10.10.10.22master-user=backup
#同步用户帐号
master-password=1234master-port=3306master-connect-retry=60
预设重试间隔60秒replicate-do-db=backup 告诉slave只做backup数据库的更新
重起数据库
用show slave status看同步配置情况。
注意:由于设置了slave的配置信息,mysql在数据库目录下生成master.info,所以如有要修改相关slave的配置要先删除该文件。否则修改的配置不能生效。
双机互备模式。
如果在A加入slave设置,在B加入master设置,则可以做B->A的同步。
在A的配置文件中 mysqld 配置项加入以下设置:
master-host=10.10.10.53master-user=backupmaster-password=1234replicate-do-db=backupmaster-connect-retry=10
在B的配置文件中 mysqld 配置项加入以下设置:
log-bin=c:mysqllogmysqllogbinlog-do-db=backup
注意:当有错误产生时*.err日志文件。同步的线程退出,当纠正错误后要让同步机制进行工作,运行slave start
重起AB机器,则可以实现双向的热备。
测试:
向B批量插入大数据量表AA(1872000)条,A数据库每秒钟可以更新2500条数据。
--------------------------------------------------------------------------------
4:MySql数据库同步复制
摘自 longrujun 的 Blog (作者Blog: http://blog.csdn.net/longrujun/ )
关键字 MySql数据库同步复制
该功能可以实现两个数据库同步,主从模式,互相备份模式的功能。
数据库同步复制功能的设置都在mysql的设置文件中体现。mysql的配置文件(windows下为my.ini,Unix/Linux下为my.cnf)
1、实施环境:
操作系统:2台linux AS 4[up3]
mysql:mysql-4.1.15.tar.gz
SvrA ip:192.168.1.10
SvrB ip:192.168.1.11
2、配置方法
Demo 1:主从模式[Master->Slave]:A->B
=====step 1:分别在SvrA、SvrB上配置同步DB及Account=====
Step A:SvrA上配置
1.增加一个用户最为同步的用户帐号:
GRANT FILE ON *.* TO backup.user@'192.168.1.11' IDENTIFIED BY ‘rsync.mysql’;
2.增加一个数据库作为同步数据库:
create database backup;
Step B:SvrB上配置
1.增加一个用户最为同步的用户帐号:
GRANT FILE ON *.* TO backup.user@'192.168.1.10' IDENTIFIED BY ‘rsync.mysql’;
2.增加一个数据库作为同步数据库:
create database backup;
====step 2:配置Master、Slave参数======
主从模式:A->B即 SvrA为master ,SvrB为slave
1、修改SvrA 中mysql的my.cnf文件。在mysqld配置项中加入下面配置:
server-id=1
log-bin
binlog-do-db=backup
注
![](https://www.evernote.com/shard/s168/res/aee53f5c-4d4d-4c48-a145-1c9dce065c3f.gif?resizeSmall&width=1275)
binlog-do-db=backup #指定需要日志的数据库
配置完后重起数据库服务。
用show master status 命令看日志情况。
2、修改SvrB中 mysql的my.cnf文件。在mysqld配置项中加入下面配置:
server-id=2
master-host=192.168.1.10
master-user=backup.user #同步用户帐号
master-password=rsync.mysql
master-port=3306
master-connect-retry=10 预设重试间隔10秒
replicate-do-db=backup 告诉slave只做backup数据库的更新
配置完后重起数据库
用show slave status看同步配置情况。
注意:由于设置了slave的配置信息,mysql在数据库目录下生成master.info
所以如有要修改相关slave的配置要先删除该文件。否则修改的配置不能生效。
Demo 2、双机互备模式。
如果在A加入slave设置,在B加入master设置,则可以做B->A的同步。
在A的配置文件中 mysqld 配置项加入以下设置:
master-host=192.168.1.11
master-user=backup.user
master-password=rsync.mysql
replicate-do-db=backup
master-connect-retry=10
在B的配置文件中 mysqld 配置项加入以下设置:
log-bin
binlog-do-db=backup
注意:当有错误产生时*.err日志文件。同步的线程退出,当纠正错误后要让同步机制进行工作,运行slave start
重起AB机器,则可以实现双向的热备。
注:
1、 在处理Slave中MYSQL,默认是启用server-id=1,所以将其修改为server-id=2
2、 在测试时,可以测试一下互连状态
Mysql –h ServerA/B –u backup.user –p
3、 关于Master->多个Slave,可以参考MYSQL官方文档
推荐1、 http://dev.mysql.com/doc/
2、 http://www.mysql.com/why-mysql/white-papers/
3、 http://www.mysql.com/products/database/cluster/
--------------------------------------------------------------------------------
4:mysql数据复制方案
[来自jollr.com]
2003年12月15日 12:00 1楼
现在找一个提供免费MYSQL的网站真不容易,即便找到了也不提供file权限,管理数据怎么办?用phpMyAdmin在线一条一条的插入?如果想搬家呢?
所以本人在一开始便设计了一套数据管理方案:
在本地将数据保存成TXT文件,FTP上传,PHP程序将其逐行读出,写入MYSQL。导出时反之。
日前偶上OSO论谈,看到有网友正苦于此事,现将源代码公布,供大家分享。如有漏洞,望指正。
由于时间关系本人并没有设计出一个通用的程序,只是举例说明。
mysql 表名:tbn
字段:
ssj: date
ssm: varchar(8)
bos: enum(\"s\",\"b\",\"f\") default s
这里只设计了三个字段,各有其特点,其它类型的字段可参照设计。
tbn.txt文件:
ssj ssm bos
------------------------------------
2001-04-05 record1 2
2001-04-06 record2 1
2001-04-08 record3 3
------------------------------------
为了导入导出TXT的一致性,将mysql的ENUM字段转存TXT文件时以索引号代替,这样便于修改、更新记录
1对应enum字段的s
2对应enum字段的b
3对应enum字段的f
字段间为TAB符
txt2db.php
<?
require \"connecthost.inc.php\";//连接到MYSQL服务器,可别照抄
$tbn=$tbn;//mysql表名
$rf=file(\"$tbn.txt\");//file是一个将TXT文件按行直接读入数组的函数
$rfs=count($rf);
for ($k=0;$k<$rfs;$k++) {
$exstr=explode(chr(9),$rf[$k]);//EXPLODE是一个字符串分割函数,CHR(9)为TAB符
$ins=mysql_query(\"insert into $tbn (ssj,ssm,bos) values(“$field[0]“,“$field[1]“,$field[2])\");
$inss=$inss+$ins;
}
echo $inss.\"个记录被插入<BR>\";
mysql_close();
?>
db2txt.php
<?
require \"connecthost.inc.php\";
$tbn=$tbn;
//下面先得到ENUM字段的所有值及对应索引号,
//如果不明白,在DOS下运行一下show columns from $tbn like “bos“,分析一下返回的结果
$fea=mysql_query(\"show columns from $tbn like “bos“\");
$fea_s=mysql_fetch_array($fea);
$fea_s2=$fea_s[“Type“];
$bosset=explode(\",\",substr($fea_s2,5,(strlen($fea_s)-6)));
$bossets=count($bosset);
for ($j=0;$j<$bossets;$j++){
$bosset[$j]=substr($bosset[$j],1,strlen($bosset[$j])-2);
}
$qh=mysql_query(\"select * from $tbn\");
$fp=fopen(\"$tbn.txt\",\"w\"); //打开一个用于写入的文件
while ($row=mysql_fetch_array($qh)) {
for ($i=0;$i<$bossets;$i++){
if ($row[2]==$bosset[$i]){
$bosdm=$i+1; //+1 because mysql enum index from 1,php array index from 0
break;
}//找到当前ENUM字段对索引号
}
$record=$row[0].chr(9).$row[1].chr(9).$bosdm.chr(13).chr(10);
//chr(9)为TAB符,chr(13).chr(10)为回车并换行
$sl=strlen($record);
$fps=fputs($fp,$record,$sl);//写入文件
}
echo \"$tbn trans over \".$fps;
fclose($fp);
mysql_close();
?>
当然,要先用FTP工具把TXT文件的属性改为可写,才能写入,想必这不用我说。
http://zjss.bbs.us/?act=program&rid=80046
--------------------------------------------------------------------------------
5:MySQL异步复制备忘
http://blog.sina.com.cn/u/4b0710d8010007eo
一、异步复制基本原理
从MySQL3.23.15以后,MySQL支持单向的异步复制。也就是说,1台MySQL服务器充当Master(主库),1台或多台MySQL服务器充当Slaves(从库),数据从Master向Slaves进行异步复制。注意,这种复制是异步的,有别于MySQL的同步复制实现(这种实现称做MySQL集群,MySQL Cluster)。
当主库有更新的时候,主库会把更新操作的SQL写入二进制日志(Bin log),并维护一个二进制日志文件的索引,以便于日志文件轮回(Rotate)。在从库启动异步复制的时候,从库会开启两个I/O线程,其中一个线程连接主库,要求主库把二进制日志的变化部分传给从库,并把传回的日志写入本地磁盘。另一个线程则负责读取本地写入的二进制日志,并在本地执行,以反映出这种变化。较老的版本在复制的时候只启用一个I/O线程,实现这两部分的功能。
有几个关键性的地方需要注意:
- 主库必须启用Bin log,主库和从库必须有唯一的Server Id
- 从库必须清楚了解从主库的哪一个Bin log文件的哪一个偏移位置起开始复制
- 从库可以从主库只复制指定的数据库,或者数据库的某些数据表
- 主库和从库的数据库名称可以不一样,不过还是推荐使用一样的名称
- 主库和从库的MySQL版本需保持一致
二、如何配置MySQL复制
我们在同一台机器做实验,1个主库,两个从库。基本情况如下:
- 主库
端口号:3308
数据目录:/var/lib/dbmaster
配置文件:/var/lib/dbmaster/my.cnf
- 从库1
端口号:3309
数据目录:/var/lib/dbslave1
配置文件:/var/lib/dbslave1/my.cnf
- 从库2
端口号:3310
数据目录:/var/lib/dbslave2
配置文件:/var/lib/dbslave2/my.cnf
待同步的数据库名位research,我们的目标是实现research从主库复制到两个从库。
(1) 主库的配置
首先,建立数据目录位置。
# mkdir /var/lib/dbmaster
然后,编辑主库的配置文件。
# vi /var/lib/dbmaster/my.cnf
写入以下内容:
[mysqld]
datadir=/var/lib/dbmaster
socket=/var/lib/dbmaster/mysql.sock
port=3308
old_passwords=1
log-bin
server-id=1270000000013308
binlog-do-db=research
[mysqld_safe]
err-log=/var/lib/dbmaster/mysqld.log
pid-file=/var/lib/dbmaster/mysqld.pid
[mysql.server]
user=mysql
basedir=/var/lib
运行下面的命令,初始化数据目录。
# mysql_install_db --defaults-file=/var/lib/dbmaster/my.cnf
# chown -R mysql.mysql /var/lib/dbmaster
注意,我们为MySQL服务单独建立了用户mysql和用户组mysql。初始化数据目录后,必须把所有者改为mysql。
现在,我们启动主库服务,在主库创建数据库research,并创建一个数据表test,然后插入一条记录。
# mysqld_safe --defaults-file=/var/lib/dbmaster/my.cnf &
# mysql -uroot -S /var/lib/dbmaster/mysql.sock
mysql> create database research;
mysql> use research;
mysql> create table test (name varchar(20));
mysql> insert into test set name=\"explorer\";
mysql> exit;
现在,我们配置主库,让从库从当前点开始复制。
首先需要配置一个用于复制的MySQL帐号,用于从库的连接。
我们锁定整个主库,避免主库数据更新。
然后我们查看主库的状态,记录下Bin log的文件名称(下例为localhost-bin.000003)和位置偏移(下例为79)。
# mysql -uroot -S /var/lib/dbmaster/mysql.sock
mysql> GRANT REPLICATION SLAVE ON *.*
-> TO 'repl'@'127.0.0.1' IDENTIFIED BY 'slavepass';
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
+----------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------------+----------+--------------+------------------+
| localhost-bin.000003 | 79 | research | |
+----------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
然后我们另开一个终端开始下一步操作,注意保持原终端不要退出mysql。
(2) 从库配置
首先,建立数据目录位置。
# mkdir /var/lib/dbslave1
然后,编辑主库的配置文件。
# vi /var/lib/dbslave1/my.cnf
写入以下内容:
[mysqld]
datadir=/var/lib/dbslave1
socket=/var/lib/dbslave1/mysql.sock
port=3309
old_passwords=1
log-bin
server-id=1270000000013309
log-slave-updates
[mysqld_safe]
err-log=/var/lib/dbslave1/mysqld.log
pid-file=/var/lib/dbslave1/mysqld.pid
[mysql.server]
user=mysql
basedir=/var/lib
运行下面的命令,初始化数据目录。
# mysql_install_db --defaults-file=/var/lib/dbslave1/my.cnf
# chown -R mysql.mysql /var/lib/dbslave1
# cp -ar /var/lib/dbmaster/research /var/lib/dbslave1
上面最后一条命令把主库的research数据库拷贝到了从库,在主库加了读锁的情况下这种拷贝是安全的。
现在,我们启动从库服务,启用主库到从库的复制。
# mysqld_safe --defaults-file=/var/lib/dbmaster/my.cnf &
# mysql -uroot -S /var/lib/dbslave1/mysql.sock
mysql> CHANGE MASTER TO
-> MASTER_HOST='127.0.0.1',
-> MASTER_PORT=3308,
-> MASTER_USER='repl',
-> MASTER_PASSWORD='slavepass',
-> MASTER_LOG_FILE='localhost-bin.000003',
-> MASTER_LOG_POS=79;
mysql> START SLAVE;
mysql> EXIT;
另一个从库配置与此类似。
(3) 同步测试
转入我们在(1)中打开的终端,此时我们还在mysql的提示符下。运行下面的SQL解锁并插入一条新记录。
mysql> UNLOCK TABLES;
mysql> use research;
mysql> insert into test set name=\"mars\";
mysql> exit;
如果正常的话应该可以在两个从库看到mars这条记录了。
三、异步复制的进一步分析
启用MySQL异步复制后,主库为每一个从库打开了一个连接,这可通过show processlist这条SQL看出来。
mysql> show processlist G
*************************** 1. row ***************************
Id: 1
User: repl
Host: localhost.localdomain:40245
db: NULL
Command: Binlog Dump
Time: 3404
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
*************************** 2. row ***************************
Id: 2
User: repl
Host: localhost.localdomain:40246
db: NULL
Command: Binlog Dump
Time: 3404
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
*************************** 3. row ***************************
Id: 4
User: root
Host: localhost.localdomain:38327
db: NULL
Command: Query
Time: 0
State: NULL
Info: show processlist
3 rows in set (0.00 sec)
线程Id为1和2的是为从库开的连接,比较重要的信息是State,描述了当前同步状态。
从库会打开两个线程,同样我们也可以通过这个SQL语句看出来。
mysql> show processlist G
*************************** 1. row ***************************
Id: 1
User: system user
Host:
db: NULL
Command: Connect
Time: 3575
State: Waiting for master to send event
Info: NULL
*************************** 2. row ***************************
Id: 2
User: system user
Host:
db: NULL
Command: Connect
Time: 3575
State: Has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
*************************** 3. row ***************************
Id: 3
User: root
Host: localhost.localdomain:47107
db: NULL
Command: Query
Time: 0
State: NULL
Info: show processlist
3 rows in set (0.00 sec)
其中线程Id为1的是复制线程,连接远程的主库,复制Bin Log到本地磁盘。线程Id为2的是执行线程,负责执行本地磁盘同步过来的Bin Log。同样State信息是关键信息。
关于State的详细说明请参考 http://dev.mysql.com/doc/refman/4.1/en/master-thread-states.html 以及 http://dev.mysql.com/doc/refman/ ... -thread-states.html 。
从库中关于复制有这么一些文件是需要注意的:
# ls /var/lib/dbslave1
ibdata1 localhost-bin.000007 localhost-bin.000016 mysqld.log
ib_logfile0 localhost-bin.000008 localhost-bin.000017 mysqld.pid
ib_logfile1 localhost-bin.000009 localhost-bin.000018 mysql.sock
localhost-bin.000001 localhost-bin.000010 localhost-bin.index relay-log.info
localhost-bin.000002 localhost-bin.000011 localhost-relay-bin.000012 research
localhost-bin.000003 localhost-bin.000012 localhost-relay-bin.index test
localhost-bin.000004 localhost-bin.000013 master.info
localhost-bin.000005 localhost-bin.000014 my.cnf
localhost-bin.000006 localhost-bin.000015 mysql
*-reloay-bin.* 从主库同步过来的Bin log文件
master.info 主库帐号信息和同步信息
relay-log.info 跟踪执行同步过来的Bin log的执行情况
mysqld.log 数据库日志,排错的时候相当有用
四、其他工具
netstat命令查看当前监听的网络端口,我们可以凭此判断MySQL端口是否开启。
# nestat -nlt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:39137 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:3308 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:3309 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:3310 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 :::6000 :::* LISTEN
mysqlbinlog工具可查看二进制的Binlog文件,这对于判断同步复制点很有用处。
# mysqlbinlog localhost-relay-bin.000012
...
mysqldump命令可用于数据复制前主从库之间同步数据(在上节中我们是通过直接拷贝文件实现的)。
参考资料:
http://dev.mysql.com/doc/refman/4.1/en/replication.html
--------------------------------------------------------------------------------
6:mysql的root口令忘记了怎么办?
数据库 /linuxman 发表于2004-11-28 13:59
这真是糟糕的事情:-
停止mysql服务:/etc/init.d/mysql stop
这样重启mysqld:/usr/bin/mysqld_safe --skip-grant-tables &
然后执行mysql -h localhost mysql可以直接进入。
执行:use mysql; select * from user; 有没有你记得口令的用户?如果有的话,执行:update user set Password=''password'' where User=''user'' and Host=''localhost''; 上面user是你记得口令的用户,password是用户user的口令。这样,root的口令就变成password啦:-)
如果所有用户的口令都不记得了(真是糟糕!),那么执行:
grant all on *.* to root@localhost identified by ''newpassword''; flush privileges;
或者:
update user SET password=password(''new_password'') WHERE user=''root'';
重新启动mysql: /etc/init.d/mysql restart
--------------------------------------------------------------------------------
7:【翻译】MYSQL数据库复制
日期:2007-01-04
作者:whsong
来源: http://www.pc51.net/data/MySQL/2007-01-04/2599.html
尽量确保所安装的MySQL版本是最新版本
4.1.x和4.0.x是相同的binary log format,所以他们中的任意两个复制都不会有问题
下面给出了一个兼容性列表:
Master
3.23.33 and up Master
4.0.3 and up or any 4.1.x Master
5.0.0
Slave 3.23.33 and up yes no no
Slave 4.0.3 and up yes yes no
Slave 5.0.0 yes yes yes
1). 在Master Server上建立一个用于Slave Server同步数据库用的帐号,这个帐号要被给予“REPLICATION SLAVE”权限,假设你的Slave Server所在的域为Slave.com,同步用用户名为repl,密码为slavepass,用如下语句在Master Server上建立用户并授权:
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.Slave.com' IDENTIFIED BY 'slavepass'; //这允许复制所有的数据库,也可以单独制定数据库
2). 如果数据库只是用了MyISAM表(从3.23.0开始,MyISAM就是MySQL数据表的默认格式了),用“FLUSH TABLES WITH READ LOCK;”语句刷新所有的表并禁止写语句。不要退出你执行上述语句的客户端,如果退出,语句执行就会结束。
3). 为Master Server上的数据做一个快照,最简单的办法就是把数据目录打成一个压缩包。Linux下使用tar命令,Windows下可以使用WinRAR。如果只复制单个数据库就只需打包那个数据库目录就可以了。将打包文件拷贝到Slave Server上,解压缩到数据库目录,如果不想Slave Server上的mysql数据库被覆盖,将压缩包里面的mysql剔除再解压缩到数据库目录。压缩包解压缩前不要包含任何日志文件,或者master.info、relay-log.info。
4). 当“FLUSH TABLES WITH READ LOCK”生效后,在Master Server上执行“SHOW MASTER STATUS;”,“File”栏下记录的是日志的名字,“Position”栏记录的是偏移量,记下日志名字和偏移量,以后要用到。然后执行“UNLOCK TABLES;”,启用写语句。
如果你使用了InnoDB表,最好的方法是使用InnoDB Hot Backup工具,可以去 http://www.innodb.com/manual.php 查看具体信息。
如果没有使用InnoDB Hot Backup工具,最快的制作InnoDB表快照的方法就是关掉Master Server,拷贝InnoDB数据文件、日志文件、表定义文件。在关闭Master Server之前,你需要记录日志文件名字和偏移量,使用下面的语句:
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
记录完以后,直接关闭Server,不要运行“UNLOCK TABLES;”,以保证快照对应的日志名字和偏移量没有改变。
mysqladmin -u root shutdown //关闭Server
注:有一个可以同时应用于MyISAM和InnoDB表的方法——做Master的SQL dump。
在Master Server上执行“mysqldump --master-data”,然后在Slave Server上导入在Master Server上导出的数据文件,但是这种方法慢。
如果Master Server以前是以 “without --log-bin enabled”运行的,那么通过“SHOW MASTER STATUS”查看的日志文件和偏移量将是空的,mysqldump也会是空的。这样,当一会要制定Slave的log file and position时,就使用空字符串“’’”和4。
5). 确保Master Server上的my.cnf文件中[mysqld]块包括一个log-bin选项和server-id=master_id选项,并且master_id是一个位于1 to 232 – 1之间的正数。
[mysqld]
log-bin
server-id=1
如果没有,添加并重启Server
6). 关闭Slave Server上的MySQL,在my.cnf活my.ini中添加
[mysqld]
server-id=slave_id
slave_id也是一个位于1 to 232 – 1之间的正数,但是不能和master_id一样。如果不止一台Slave Server,则每一台Slave Server的slave_id不能相同。
启动Slave Server上的MySQL之前,确保从Master Server上备份的数据已经放到Slave Server上MySQL的数据库目录中。并确认权限设置正确。如果使用mysqldump备份的,先启动Slave Server。
7). 启动Slave Server上的MySQL。如果以前设置过复制,则使用--skip-slave-start选项,确保启动后不立即连接Master Server。也可以使用--log-warnings选项,当出现问题时可以获得更多的信息。
如果使用mysqldump备份数据的,导入数据:“mysql -u root -p < dump_file.sql”
8). 在Slave Server上执行下面的语句:
mysql> CHANGE MASTER TO
-> MASTER_HOST='master_host_name',
-> MASTER_USER='replication_user_name',
-> MASTER_PASSWORD='replication_password',
-> MASTER_LOG_FILE='recorded_log_file_name',
-> MASTER_LOG_POS=recorded_log_position;
替换选项中的值为实际值。
下面是选项长度限制:
MASTER_HOST 60
MASTER_USER 16
MASTER_PASSWORD 32
MASTER_LOG_FILE 255
9). 启动Slave线程:
mysql> START SLAVE;
至此,应该可以实现数据库的复制了。
其他问题:
如果忘记设置Master Server的server-id的值,Slave Server就不能连接到Master Server
如果忘记设置Slave Server的server-id的值,你将得到下面的错误提示:
Warning: You should set server_id to a non-0 value if master_host is set; We force the server id to 2, but this MySQL server will not act as a slave.
如果出现其他原因导致不能同步,你可以在Slave的错误日志里看到错误提示。
当Slave Server开始复制数据库时,你可以在data directory中发现master.info和relay-log.info,Slave通过这两个文件来跟踪Master的binary log。不要删除和编辑这两个文件,尽量使用“CHANGE MASTER TO”语句。
master.info会覆盖一些在命令行制定的选型和在my.cnf中的选项。
当配置好一台Slave Server后,可以使用同样的方法配置其他的Slave Server,不需要重新备份Master Server的数据库,使用同一个即可。