关闭

mysql 热备份2

593人阅读 评论(0) 收藏 举报
在这一章节里, 我们来了解下如何在 Mysql 中进行用户授权及主从复制
 
这里先来了解下 Mysql 主从复制的优点:
 
1、 如果主服务器出现问题, 可以快速切换到从服务器提供的服务
2、 可以在从服务器上执行查询操作, 降低主服务器的访问压力
3、 可以在从服务器上执行备份, 以避免备份期间影响主服务器的服务
注意一般只有更新不频繁的数据或者对实时性要求不高的数据可以通过从服务器查询, 实时性要求高的数据仍然需要从主数据库获得
 
在这里我们首先得完成用户授权, 目的是为了给从服务器有足够的权限来远程登入到主服务器的 Mysql
 
在这里我假设
主服务器的 IP 为: 192.168.10.1
从服务器的 IP 为: 192.168.10.2
 

Mysql grant 用户授权

 
查看 Mysql 的用户表

msyql> mysql -uroot -p123123;

msyql> select user, host, password from mysql.user;

结果如下:
+------------------+-----------+-------------------------------------------+
| user             | host      | password                                  |
+------------------+-----------+-------------------------------------------+
| root             | localhost | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |
| root             | 127.0.0.1 | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |
+------------------+-----------+-------------------------------------------+

从如上表中看以看出 root 用户只能从本机登入 Mysql, 也就是来自 localhost 或者 127.0.0.1
 
现在来通过 grant 命令来添加授权用户

msyql> ? grant   //查看 grant 的详细用法
 
msyql> grant all on *.* to user1@192.168.10.2 identified by "123456"; // *.* = 所有的数据库.所有的表
//或者

msyql> grant replication slave on *.* to 'user2'@'192.168.10.%' identified by "123456"; // %代表通配符


通过了 grant 命令给予了来自 192.168.10.2 的用户 user1 权限, 允许其远程登录, 如下:

+------------------+--------------+-------------------------------------------+
| user             | host         | password                                  |
+------------------+--------------+-------------------------------------------+
| root             | localhost    | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |
| root             | 127.0.0.1    | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |
| user1            | 192.168.10.2 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| user2            | 192.168.10.% | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+------------------+--------------+-------------------------------------------+

此时就可以在 192.168.10.2 的机器上访问 10.1 的 Mysql 了, 如下:

msyql> mysql -uuser1 -p123456 -h192.168.10.1;



Mysql bin-log 日志

 
开启 bin-log 二进制日志, 它保存了所有增删改的操作, 以便于数据恢复或同步

修改主服务器 mysql 配置文件:


shawn@Shawn:~$ sudo vi /etc/mysql/my.cnf;

 
/********** my.cnf **********/
[mysqld]
 
#开启慢查询日志, 记录查询过长的 sql 语句,以便于优化

log_slow_queries   = /var/log/mysql/mysql-slow.log

 
#开启 bin-log 日志

log-bin            = /var/log/msyql/mysql-bin.log


添加完成后重启 Mysql 服务

shawn@Shawn:~$ sudo /etc/init.d/mysql restart


现在你可以通过如下命令来查看 bin-log 日志是否成功开启

mysql> show variables like "%log_%";

 
| log_bin                 | ON        |
| log_slow_queries        | ON        |

如果显示为 ON, 那么就可以在 /var/log/mysql/ 文件夹看到 mysql-bin.000001 二进制文件
 
关于 bin-log 日志的相关操作:

mysql> flush logs;


此时就会多一个最新的 bin-log 日志

mysql> show master status;


查看最后一个 bin-log 日志, 如下:

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 |      107 |              |                  |
+------------------+----------+--------------+------------------+
 

mysql> show master logs;


查看所有 bin-log 日志, 如下:

+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |      4340 |
| mysql-bin.000002 |       107 |
+------------------+-----------+
 

mysql> reset master;


清空所有 bin-log 日志

shawn@Shawn:~$ mysqlbinlog /var/log/mysql/mysql-bin.000001 | more

查看 bin-log 日志内容

#如果有字符集问题的话可以执行:
shawn@Shawn:~$ mysqlbinlog --no-defaults /var/log/mysql/mysql-bin.000001

shawn@Shawn:~$ mysqlbinlog /var/log/mysql/mysql-bin.000002 | mysql -uroot -p123123 test;
恢复 mysql-bin.000002 中所有的操作到 test 数据库中

shawn@Shawn:~$ mysqlbinlog /var/log/mysql/mysql-bin.000002 --start-position="193" --stop-position="398" | mysql -uroot -p123123 test;
恢复 mysql-bin.000002 中指定的操作(position)到 test 数据库中

 

Mysql 主从复制 - 数据同步

 
到这一步的时候首先确保 Mysql 用户授权已经完成以及 Mysql bin-log 日志已经成功开启
并确保每台服务器的 server-id 是唯一的

 主服务器的配置

再次修改主服务器(192.168.10.1)的 mysql 配置文件:

shawn@Shawn:~$ sudo vi /etc/mysql/my.cnf;

 
/********** my.cnf **********/
#取消 server-id 注释符号

server-id   = 1

/****************************/
 
#重启 Mysql 服务

shawn@Shawn:~$ sudo /etc/init.d/mysql restart


到这里, 主服务器的配置已经完成, 很简单
 
这次我们主要做的是让从服务器同步主服务器的数据, 同步的是将来所有对主服务做的增删改操作, 但是现有主服务器中的大量数据得先手动同步到从服务器, 操作如下:


#清空一下主服务器的 bin-log 日志, (可选: 保险操作, 防止主从 bin-log 日志混乱)

mysql> reset master;

 
#然后备份导出主服务器中现有的 test 数据库

shawn@Shawn:~$ mysqldump -uroot -p123123 test -l -F > /tmp/test.sql;

 
-F = flush logs, 生成新的日志文件, 包括 bin-log 日志
-l = lock 数据库, 防止在导出的时候被写入数据, 完成后自动解锁
 
#完成后把文件传输给从服务器

shawn@Shawn:~$ scp /tmp/test.sql 192.168.10.2:/tmp/

 
#然后再查询确保一下从服务器已经成功授过权

mysql> show grants for user1@192.168.10.2\G

 
*************************** 1. row ***************************
Grants for user1@192.168.10.2:
GRANT ALL PRIVILEGES ON *.* TO 'user1'@'192.168.10.2'

IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'



完成后, 现在我们到从服务器 (192.168.10.2) 导入现有的数据:

从服务器的配置


#清空一下从服务器的 bin-log 日志, (可选: 保险操作)

mysql> reset master;

 
#然后导入主服务器中现有的数据

shawn@Shawn:~$ mysqldump -uroot -p123123 test -v -f < /tmp/test.sql;


 
-v = 查看导入的详细信息
-f = 是当中间遇到错误时, 可以 skip 过去, 继续执行下面的语句
当然你也可以用 source 命令导入
好了, 目前为止主服务器(192.168.10.1)和从服务器(192.168.10.2)现有的数据已经成功手动同步
 

接下来修改从服务器(192.168.10.2)的 mysql 配置文件:


shawn@Shawn:~$ sudo vi /etc/mysql/my.cnf;

 
/********** my.cnf **********/
#取消 server-id 注释符号, 并修改值

server-id       = 2

 
#取消 master-host 注释符号, 并修改值

master-host     = 192.168.10.1

 
#取消 master-user 注释符号, 并修改值

master-user     = user1

 
#取消 master-password 注释符号, 并修改值

master-password = 123456

 
#取消 master-port 注释符号, 并修改值, 主服务器默认端口号为: 3306

master-port     = 3306

/****************************/
 
#重启 Mysql 服务

shawn@Shawn:~$ sudo /etc/init.d/mysql restart


配置文件修改完成, 此时在从服务器中登入自己的 Mysql, 而不是远程登入主服务器(192.168.10.1)

#在从服务器中登入自身的 Mysql

msyql> mysql -uroot -p123123;

 
#查看是否已经取得同步

msyql> show slave status\G

 
*************************** 1. row ***************************
      Connect_Retry: 60
    Master_Log_FIle: mysql-bin.000002
Read_Master_Log_Pos: 106
   Slave_IO_Running: Yes
  Slave_SQL_Running: Yes

Slave_IO_Running 如果是 Yes 的话代表成功从主服务器中同步到 bin-log 日志
Slave_SQL_Running 如果是 Yes 的话代表成功执行 bin-log 日志中的 SQL 语句
此时的 Master_Log_FIle 和 Read_Master_Log_Pos 的值应该对应主服务器中的 show master status 命令的值
Connect_Retry 中的 60 代表每 60 秒就去主服务器同步 bin-log 日志
 
OK, 如果你看到的是那两个关键的 Yes, 那你就可以去测试了, 在主服务器插入新的数据, 再去从服务器查看, 不出意外的话, 你会兴奋一下, 数据已经同步了
 
这里再说一下其他经常用到的命令:

#启动复制线程
msyql> start slave
 
#停止复制线程
msyql> stop slave
 
#动态改变到主服务器的配置
msyql> change master to
 
#查看从数据库运行进程
msyql> show processlist

这里也同时说一下操作中的常见错误:
 
问题: 从数据库无法同步
Slave_SQL_Running 值为 NO, 或 Seconds_Bebind_Master 值为 Null

原因:
一、 程序有可能在 slave 上进行了写操作
二、 也有可能是 slave 机器重启后, 事务回滚造成的

解决方法一:
复制代码 代码如下:

msyql> stop slave;
 
msyql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
 
msyql> start slave;

解决方法二:
复制代码 代码如下:

msyql> stop slave;
 
#查看主服务器上当前的 bin-log 日志名和偏移量
msyql> show master status;
 
#获取到如下内容:
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 |      286 |              |                  |
+------------------+----------+--------------+------------------+
 
#然后到从服务器上执行手动同步
msyql> change master to
    -> master_host="192.168.10.1"
    -> master_user="user1"
    -> master_password="123456"
    -> master_post=3306
    -> master_log_file="mysql-bin.000005"
    -> master_log_pos=286;
    
msyql> start slave;

再次通过 show slave status 查看:
如果 Slave_SQL_Running 的值变为 Yes, Seconds_Bebind_Master 的值为 0 时, 即正常
 
好了, 如上是我自己在操作中所总结的一些内容, 如有更好的建议, 欢迎留言一起探讨
顺便说一下, 我使用的是 Ubuntu 12.04

====================================================================================================================================

 Linux下mysql主从同步备份master-slave详细配置


1、概要

首先要准备两台服务器,一台主服务器(Master),另一台从服务器(Slave),然后要保证Master与Slave的版本要相同且Master不能高于Slave的版本,一般稳健的做法都是使其版本相同,因为MySQL不同版本之间的binlog(二进制日志)格式可能会不一样,最后会导致同步出现异常。介绍先到这里,以下我们先确认两台服务器的信息:

主服务器(Master):
IP:192.168.1.100
系统:Linux(Ubuntu 64位 v10.10)
MySQL版本:5.1.49
需要同步的数据库名:myslave
用于同步的帐号:slave001
用于同步的密码:timescode888

————————————–

从服务器(Slave)
IP:192.168.1.90
系统:Linux(Ubuntu 32位 v10.10)
MySQL版本:5.1.49
需要同步的数据库名:myslave

注:以下的配置以及测试都是使用SSH来进行的

2、修改Master服务器的配置


#打开my.cnf配置文件

vi /etc/mysql/my.cnf


#键入 /server-id 找到server-id的位置,把以下内容对照设置进去,键入 i,激活输入状态
#注意,这里的Master与Slave的server-id不能相同

server-id               = 1
log_bin                 = /var/log/mysql/mysql-bin.log
expire_logs_days        = 10
max_binlog_size         = 100M
binlog_do_db            = myslave #如果需要同时同步多个数据库,请另起一行设置binlog_do_db=需要同步的数据库名称
binlog_ignore_db        = mysql

3、在Master建立myslave数据库并建立相关的数据表

SQL代码如下


#建立数据库
mysql -u root -p

mysql> CREATE DATABASE myslave CHARSET ‘utf8′;

#建立数据表
– —————————-
– Table structure for `users`
– —————————-
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL,
`website` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

– —————————-
– Table structure for `users_log`
– —————————-
DROP TABLE IF EXISTS `users_log`;
CREATE TABLE `users_log` (
`user_log_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`info` varchar(200) DEFAULT NULL,
`uid` mediumint(8) unsigned NOT NULL,
PRIMARY KEY (`user_log_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

4、建立用于replication的帐号

grant replication slave on *.* to myslave001@’%’ identified by ‘timescode888′;
quit
#重启服务器
/etc/init.d/mysql restart

#进入mysql查看有没有生效
mysql -u root -p

mysql> show master status;
+——————+———-+————–+——————+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000001 |      106 | myslave      | mysql            |
+——————+———-+————–+——————+

#以上可以看出跟在my.cnf里设置的是一致的,在此要记下File以及Position的值,后面在Slave服务器上会用到

5、使用mysqldump导出Master中的myslave数据库


#在此必须要加入–master-data选项,保证在dump时会记录到binlog名称和偏移值
#而使用–lock-all-tables的原因就是为了数据在导出的时候没有其它新数据插入,保证一致性

mysqldump –master-data=1 –lock-all-tables=true -uroot -pwww.timescode.com myslave > /home/myslave_bak_20110326.sql

#具体的根据实际情况而变化,不一定要使用root帐号来导出数据

6、使用sz命令下载备份文件
sz /home/myslave_bak_20110326.sql

7、修改Slave服务器的配置


#具体的路径以及版本都与Master服务器一样

vi /etc/mysql/my.cnf


#请对照设置,如下
server-id        = 2
master-host        = 192.168.1.100
master-user        = myslave001
master-password        = timescode888
master-port        = 3306
master-connect-retry    = 5
replicate-do-db        = myslave
replicate-ignore-db    = mysql

8、使用rz命令上传备份文件到Slave服务器

rz
#当弹出选项框后选取刚才下载的备份文件
#把文件上传到home目录,具体的你可以根据你实际环境来操作

9、建立数据库并导入备份数据
mysql -u root -p

mysql> CREATE DATABASE myslave CHARSET ‘utf8′;
mysql> use myslave;
mysql> source /home/myslave_bak_20110326.sql;

#查看有没有导入成功
mysql> show tables;
+——————-+
| Tables_in_myslave |
+——————-+
| users             |
| users_log         |
+——————-+
2 rows in set (0.00 sec)

#由于刚才没有重启mysql,先需要退出去重启一下
mysql> quit

10、重启Slave服务器上的mysql
/etc/init.d/mysql restart
mysql -u root -p

#配置Slave信息并启动Slave服务
mysql> CHANGE MASTER TO
-> MASTER_HOST=’192.168.1.100′,
-> MASTER_USER=’myslave001′,
-> MASTER_PASSWORD=’timescode888′,
-> MASTER_LOG_FILE=’mysql-bin.000001′,
-> MASTER_LOG_POS=106;

#以上的是关键,具体的MASTER_LOG_FILE以及MASTER_LOG_POS的数据,可以从Master服务器获得,如果不设置,将无法正常启动Slave服务
#启动Slave服务
mysql> start slave;

#查看同步状态
mysql> show slave status;

#当输入命令后会出现一大堆的状态,具体的看Slave_IO_Running以及Slave_SQL_Running的状态,如果都是Yes就代表正常
#然后还可以看到Slave_IO_State的状态是Waiting for master to send event,含义是等待Master服务器发送事件

11、测试同步
#在Master服务器插入一条数据
mysql> use myslave;
mysql> INSERT INTO users(‘username’,'website’) VALUES(‘edison’,'http://www.timescode.com’);

#插入成功之后,稍等片刻,就可以在Slave服务器上查看到相同记录
#如果插入不成功,放心,你可以再仔细检查一下本配置文档,是否有那一步有遗漏或没正确配置。

12、后述
#如果想要查看当前Slave服务器的同步状态及偏移值等信息,请查找master.info文件

more /var/lib/mysql/master.info

#查看Slave执行binlog文件的情况
more /var/lib/mysql/relay-log.info

#如果对本文有疑问或建议请给我留言。
Mysql 主从服务与集群的区别
在Mysql Master/Slave 模式备份中(Mysql 4以上提供),
Slave主要是来备份数据的,只有当Master出现故障时,Slave才会接过Master的服务,
对外部请求进行处理,直到Master恢复正常。
就是说,在Master/Slave中,要么是Master在服务,要么是Slave在服务,不会Master/Slave同时提供服务。
而在Mysql cluster中(mysql 5 以上提供基于内存交换数据的cluster),
是Cluster的各个mysql服务在同时对外处理请求,这种模式性能更高,
同时各个集群节点的数据是基于内存进行互备的。
在Mysql 5 的 cluster中,会同时存在两份相同的数据,一份是基于硬盘的,是存储本地数据库实例的数据的,
另外一份是基于内存的,用于与集群中的其他节点进行数据同步的。
相对来说,对系统的开销会大一些,而且不能适应于大数据量的应用环境中,因为受到系统内存的限制。


个人在5.5上配置成功

 
环境说明:
Master:192.168.1.200
Slave:192.168.1.132

 
MySQL 的 Master 配置:
配置my.cnf:

 
# vi /etc/my.cnf

 
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
server-id=200
log-bin=mysql-bin
relay-log=relay-bin
relay-log-index=relay-bin-index

 
*配置好后,重启Master 的 MySQL服务!!!

 
service mysqld restart

 
//--------------------------------------------------
MySQL 的 Slave 配置:
配置my.cnf:

 
# vi /etc/my.cnf

 
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
server-id=132
log-bin=mysql-bin
replicate-do-db=test
log-slave-updates=1

 
*配置好后,重启Slave 的 MySQL服务!!!

 
service mysqld restart

 
//--------------------------------------------------
登录Slave,然后执行下面命令:

 
mysql> stop slave;
mysql> change master to master_host='192.168.1.200',master_user='root',master_password='123456';
mysql> start slave;
mysql> show slave status\G;

 
查看这两项是否为YES,yes为正常。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes


主从的作用:

1.可以当做一种备份方式

2.用来实现读写分离,缓解一个数据库的压力

 MySQL主从备份原理:

Mysql的主从复制至少是需要两个Mysql的服务,当然Mysql的服务是可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。

如果想配置成为同一台上的话,注意安装的时候,选择两个不同的prefix=路径,同时开启服务器的时候,端口不能相同。

(1)首先确保主从服务器上的Mysql版本相同(做主从服务器的原则是,MYSQL版本要相同,如果不能满足,最起码从服务器的MYSQL的版本必须高于主服务器的MYSQL版本 )

(2)在主服务器上,设置一个从数据库的账户,使用REPLICATION SLAVE赋予权限,如:
复制代码 代码如下:

 mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave001'@'192.168.0.99' IDENTIFIED BY

'123456';

Query OK, 0 rows affected (0.13 sec)

[原理]master 上提供binlog ,

slave 通过 I/O线程从 master拿取 binlog,并复制到slave的中继日志中

slave 通过 SQL线程从 slave的中继日志中读取binlog ,然后解析到slave中

 主从复制大前提

需要master与slave同步,因为笔者的数据库数据量不大,所以无需考虑太多,直接把

master上的data复制到了slave上,但是如果是大的数据量,比如像taobao这个的系统

实验环境准备:

OS: CentOS5.4

Mysql:Mysql-5.0.41.tar.gz
辅助工具:SSH Secure Shell Client

两台测试IP&服务器:
复制代码 代码如下:

Master Server: 192.168.1.2/Linux CentOS5.4/MYSQL 5.0
Slave Server: 192.168.1.3/Linux CentOS5.4/MYSQL 5.0

 安装配置步骤:

 1、首先在Linux环境下分配好磁盘分区以便留足MySQL数据库的备份空间
复制代码 代码如下:

[root@vps mysql]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/simfs 30G 2.0G 29G 7% /


 2、MySQL数据库的安装:

1>将Mysql-5.0.41.tar.gz通过SSH 工具 上传到Linux系统的home目录下

2>建立MySQL使用者和群组:
复制代码 代码如下:

#groupadd mysql
#useradd -g mysql mysql

3>解压缩Mysql-5.0.41.tar.gz源码包

复制代码 代码如下:

#cd /usr/local/sofrware
#tar zxvf Mysql-5.0.41.tar.gz

4>进入源码目录编译安装
复制代码 代码如下:

#cd /home/Mysql-5.0.41
#./configure --prefix=/usr/local/mysql --with-charset=gbk |注:配置Mysql安装路径并且支持中文
#make |注:编译
#make install |注:编译安装

5>替换/etc/my.cnf文件,进入源码包,执行命令
复制代码 代码如下:

#cd /home/Mysql-5.0.41
#cp support-files/my-medium.cnf /etc/my.cnf

6>完成以上操作以后进行初始化数据库,进入已经安装好的mysql目录
复制代码 代码如下:

#cd /usr/local/mysql
#bin/mysql_install_db --user=mysql |注:--user=mysql 初始化表并且规定用mysql用户

7>设置给mysql和root用户设定访问权限 我们先进入mysql目录
复制代码 代码如下:

#cd /usr/local/mysql
#chown -R root /usr/local/mysql      注:设定root能访问/usr/local/mysq
#chown -R mysql /usr/local/mysql/var   注:设定mysql用户能访问/usr/local/mysql/var
#chgrp -R mysql /usr/local/mysql     注:设定mysql组能够访问/usr/local/mysq

8>启动mysql,进入已经安装好的目录
复制代码 代码如下:

#cd /usr/local/mysql
#bin/mysqld_safe --user=mysql &

9>
修改mysql数据库超级用户root的缺省密码:
复制代码 代码如下:

/usr/local/mysql/bin/mysqladmin -u root password 'mysql'

关闭mysql服务器
复制代码 代码如下:

cd /usr/local/mysql/bin
./mysqladmin -u root -p shutdown

10>设定开机就启动mysql,进入源码目录下
复制代码 代码如下:

# cd /home/Mysql-5.0.41
# cp support-files/mysql.server /etc/init.d/mysql

# chmod +x /etc/init.d/mysql
# chkconfig --level 345 mysql on
# service mysql restart
Shutting down MySQL. [ 确定 ]
Starting MySQL [ 确定 ]
[root@localhost mysql]#

到这里MySQL就装好了。
 

3、配置MySQL5.0的复制(Replication)功能

 一.将master设置为只读。

mysql> flush tables with read lock;

二.用master中的data文件夹替换slave中的data文件夹

比如 用 tar zcvf mysql_data.gz /media/raid10/mysql/3306/data

然后 mv mysql_data.gz /media/raid10/htdocs/blog/wordpress/

因为我的 /media/raid10/htdocs/blog/wordpress/ 是 Nginx 的主目录

所以可以在 slave上,用wget下载这个文件,然后 解压,并覆盖slave上的data文件

注意:覆盖之前最好备份源文件

三.配置master的my.cnf,添加以下内容

在[mysqld]配置段添加如下字段

复制代码 代码如下:

server-id=1

log-bin=/media/raid10/mysql/3306/binlog/binlog //这里写你的binlog绝对路径名

binlog-do-db=blog //需要同步的数据库,如果没有本行,即表示同步所有的数据库

binlog-ignore-db=mysql //被忽略的数据库

 

这里给出我的my.cnf配置文件

复制代码 代码如下:

[client]

character-set-server = utf8

port = 3306

socket = /tmp/mysql.sock

[mysqld]

character-set-server = utf8

replicate-ignore-db = mysql

replicate-ignore-db = test

replicate-ignore-db = information_schema

user = mysql

port = 3306

socket = /tmp/mysql.sock

basedir = /usr/local/webserver/mysql

datadir = /media/raid10/mysql/3306/data

log-error = /media/raid10/mysql/3306/mysql_error.log

pid-file = /media/raid10/mysql/3306/mysql.pid

open_files_limit = 10240

back_log = 600

max_connections = 5000

max_connect_errors = 6000

table_cache = 614

external-locking = FALSE

max_allowed_packet = 16M

sort_buffer_size = 1M

join_buffer_size = 1M

thread_cache_size = 300

#thread_concurrency = 8

query_cache_size = 20M

query_cache_limit = 2M

query_cache_min_res_unit = 2k

default-storage-engine = MyISAM

thread_stack = 192K

transaction_isolation = READ-COMMITTED

tmp_table_size = 20M

max_heap_table_size = 20M

long_query_time = 3

log-slave-updates

log-bin = /media/raid10/mysql/3306/binlog/binlog

binlog-do-db=blog

binlog-ignore-db=mysql

 binlog_cache_size = 4M

binlog_format = MIXED

max_binlog_cache_size = 8M

max_binlog_size = 20M

relay-log-index = /media/raid10/mysql/3306/relaylog/relaylog

relay-log-info-file = /media/raid10/mysql/3306/relaylog/relaylog

relay-log = /media/raid10/mysql/3306/relaylog/relaylog

expire_logs_days = 30

key_buffer_size = 10M

read_buffer_size = 1M

read_rnd_buffer_size = 6M

bulk_insert_buffer_size = 4M

myisam_sort_buffer_size = 8M

myisam_max_sort_file_size = 20M

myisam_repair_threads = 1

myisam_recover

 interactive_timeout = 120

wait_timeout = 120

 skip-name-resolve

#master-connect-retry = 10

slave-skip-errors = 1032,1062,126,1114,1146,1048,1396

#master-host = 192.168.1.2

#master-user = username

#master-password = password

#master-port = 3306

 server-id = 1

innodb_additional_mem_pool_size = 16M

innodb_buffer_pool_size = 20M

innodb_data_file_path = ibdata1:56M:autoextend

innodb_file_io_threads = 4

innodb_thread_concurrency = 8

innodb_flush_log_at_trx_commit = 2

innodb_log_buffer_size = 16M

innodb_log_file_size = 20M

innodb_log_files_in_group = 3

innodb_max_dirty_pages_pct = 90

innodb_lock_wait_timeout = 120

innodb_file_per_table = 0

 #log-slow-queries = /media/raid10/mysql/3306/slow.log

#long_query_time = 10

 [mysqldump]

quick

max_allowed_packet = 32M

 

四.在master机上为slave机添加一同步帐号

复制代码 代码如下:

mysql> grant replication slave on *.* to 'admin'@'172.29.141.115' identified by '12345678';

mysql> flush privileges ;

 

五.配置slave的my.cnf,添加以下内容

注意:

1.如果mysql是5.5.3-m3 的版本,只需

在[mysqld]字段下添加如下内容

server-id=2

 2.如果是5.0x的版本,需要

在[mysqld]字段下添加如下内容

复制代码 代码如下:

server-id=2

log-bin=mysql-bin //这是同步的binlog,具体以你的binlog为准

master-host=172.29.141.112

master-user=admin

master-password=12345678

master-port=3306

master-connect-retry=60 //如果发现主服务器断线,重新连接的时间差;

replicate-do-db=blog //同步的数据库,不写本行 表示 同步所有数据库

replicate-ignore-db=mysql //不需要备份的数据库

log-slave-update

slave-skip-errors

 我的mysql是5.5.3,这里给出我的slave my.cnf配置文件

复制代码 代码如下:

[client]

character-set-server = utf8

port = 3306

socket = /tmp/mysql.sock

 

[mysqld]

character-set-server = utf8

replicate-ignore-db = mysql

replicate-ignore-db = test

replicate-do-db = blog

replicate-ignore-db = information_schema

user = mysql

port = 3306

socket = /tmp/mysql.sock

basedir = /usr/local/webserver/mysql

datadir = /media/raid10/mysql/3306/data

log-error = /media/raid10/mysql/3306/mysql_error.log

pid-file = /media/raid10/mysql/3306/mysql.pid

open_files_limit = 10240

back_log = 600

max_connections = 5000

max_connect_errors = 6000

table_cache = 614

external-locking = FALSE

max_allowed_packet = 16M

sort_buffer_size = 1M

join_buffer_size = 1M

thread_cache_size = 300

#thread_concurrency = 8

query_cache_size = 20M

query_cache_limit = 2M

query_cache_min_res_unit = 2k

default-storage-engine = MyISAM

thread_stack = 192K

transaction_isolation = READ-COMMITTED

tmp_table_size = 20M

max_heap_table_size = 20M

long_query_time = 3

log-slave-updates

log-bin = /media/raid10/mysql/3306/binlog/binlog

binlog_cache_size = 4M

binlog_format = MIXED

max_binlog_cache_size = 8M

max_binlog_size = 20M

relay-log-index = /media/raid10/mysql/3306/relaylog/relaylog

relay-log-info-file = /media/raid10/mysql/3306/relaylog/relaylog

relay-log = /media/raid10/mysql/3306/relaylog/relaylog

expire_logs_days = 30

key_buffer_size = 10M

read_buffer_size = 1M

read_rnd_buffer_size = 6M

bulk_insert_buffer_size = 4M

myisam_sort_buffer_size = 8M

myisam_max_sort_file_size = 20M

myisam_repair_threads = 1

myisam_recover

interactive_timeout = 120

wait_timeout = 120

 skip-name-resolve

#master-connect-retry = 60

slave-skip-errors = 1032,1062,126,1114,1146,1048,1396

 #master-host=172.29.141.112

#master-user = admin

#master-password = 12345678

#master-port = 3306

server-id = 2

innodb_additional_mem_pool_size = 16M

innodb_buffer_pool_size = 20M

innodb_data_file_path = ibdata1:56M:autoextend

innodb_file_io_threads = 4

innodb_thread_concurrency = 8

innodb_flush_log_at_trx_commit = 2

innodb_log_buffer_size = 16M

innodb_log_file_size = 20M

innodb_log_files_in_group = 3

innodb_max_dirty_pages_pct = 90

innodb_lock_wait_timeout = 120

innodb_file_per_table = 0

#log-slow-queries = /media/raid10/mysql/3306/slow.log

#long_query_time = 10

[mysqldump]

quick

max_allowed_packet = 32M

 六.通过查看master的状态(在master上查看),为配置slave做准备

复制代码 代码如下:

mysql> show master status/G;

ERROR 2006 (HY000): MySQL server has gone away

No connection. Trying to reconnect...

Connection id: 13

Current database: blog

*************************** 1. row ***************************

File: binlog.000005

Position: 592

Binlog_Do_DB: blog

Binlog_Ignore_DB: mysql

1 row in set (0.01 sec)

ERROR:

No query specified

 从上面的信息,可以看出,master现在使用的binlog是binlog.000005,position是592,那么下面的slave配置必须与这个对应。

 其实binlog.000005是当前master使用的binlog日志文件

position是当前master使用的binlog.000005日志文件的位置

简单理解为master正在使用哪个binlog的哪个数据行(位置)。


七.如果是5.5.3-m3版本mysql,需要启动slave后,配置与master相关对应的信息(在slave上配置)

注意,这个与第六步相对应

复制代码 代码如下:

mysql> stop slave ;

mysql> change master to master_host='172.29.141.112', master_user='admin', master_password='12345678', master_log_file='binlog.000005', master_log_pos=488;
mysql> CHANGE MASTER TO MASTER_CONNECT_RETRY=60;

 这个与5.0的配置my.cnf作用是一样的,配置成与master相对应的内容

主要是配置slave,让slave知道从master的哪个binlog上的哪个位置复制数据。所以需要知道master的ip,user_name,user_passwd,binlog,binlog_position以及多长时间连接一次master

 八.开启slave

复制代码 代码如下:

mysql> start slave;

 九.解除master只读限制,并做测试
复制代码 代码如下:

mysql> unlock tables;

mysql> use blog;

mysql> create longxibendi ( a int, b int );


十.从slave上查看

复制代码 代码如下:

mysql> use blog;

mysql> show tables;

+-----------------------+

| Tables_in_blog |

+-----------------------+

| longxibendi |

| wp_commentmeta |

| wp_comments |

| wp_links |

| wp_options |

| wp_postmeta |

| wp_posts |

| wp_term_relationships |

| wp_term_taxonomy |

| wp_terms |

| wp_usermeta |

| wp_users |

+-----------------------+

12 rows in set (0.00 sec)


可以看到成功了!!

 十一.配置过程中,可以用 show slave status/G; 在 slave上

查看 slave的复制情况

十二.如果出现什么问题,可能是防火墙的问题

/etc/init.d/iptables stop 关闭 master 上的防火墙,或者进行相应的配置

常遇到的错误与解决:

1.[mysql]ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

这个错误,网上有很多说法,其实直接的原因是mysql服务器没有启动

之前我按照5.0x配置master-slave,然后启动slave,在连接slave,就会报这个错误

后来发现原因是,mysql slave没有启动起来,然后去查错误日志,发现以下的字段

复制代码 代码如下:

110505 01:55:20 mysqld_safe mysqld from pid file /media/raid10/mysql/3306/mysql.pid ended

110505 02:04:41 mysqld_safe Starting mysqld daemon with databases from /media/raid10/mysql/3306/data

InnoDB: The InnoDB memory heap is disabled

InnoDB: Mutexes and rw_locks use InnoDB's own implementation

110505 2:04:41 InnoDB: highest supported file format is Barracuda.

110505 2:04:41 InnoDB Plugin 1.0.6 started; log sequence number 44338

110505 2:04:41 [ERROR] /usr/local/webserver/mysql/libexec/mysqld: unknown variable 'master-connect-retry=60'

110505 2:04:41 [ERROR] Aborting

110505 2:04:41 InnoDB: Starting shutdown...

110505 2:04:43 InnoDB: Shutdown completed; log sequence number 44348

110505 2:04:43 [Note] /usr/local/webserver/mysql/libexec/mysqld: Shutdown complete

 110505 02:04:43 mysqld_safe mysqld from pid file /media/raid10/mysql/3306/mysql.pid ended

110505 02:07:44 mysqld_safe Starting mysqld daemon with databases from /media/raid10/mysql/3306/data

InnoDB: The InnoDB memory heap is disabled

InnoDB: Mutexes and rw_locks use InnoDB's own implementation

110505 2:07:44 InnoDB: highest supported file format is Barracuda.

110505 2:07:45 InnoDB Plugin 1.0.6 started; log sequence number 44348

110505 2:07:45 [ERROR] /usr/local/webserver/mysql/libexec/mysqld: unknown variable 'master-host=172.29.141.112'

110505 2:07:45 [ERROR] Aborting


从上面的ERROR,知道 master-connect-retry=60这个my.cnf中的参数有问题,后来从网上搜资料,发现,mysql5.5.3-m3版本不支持这个参数,

然后我把这个参数注释掉,又发现不支持这个参数master-host,从上面的ERROR字段可以看出来。后来,就知道,5.5.3-m3不能按5.0.x那样配置

原来不需要从my.cnf中配置master相关信息,当然server-id是必须的。其他信息,通过 在命令行中 ,登陆 mysql服务器配置。

其实server-id的作用是

第一,标识,区分不同的slave,第二,防止环备份的发生

 

2.Last_Error: Last_SQL_Error:等错误

这个是从 slave上,运行 show slave status/G; 得到的。出现这个问题,最根本的原因是,slave 没有与当前的master的binlog 和binlog的position对应上

也就是说,slave传输的master binlog 不与当前master正使用的binlog以及binlog的行数对应。

 

3.[ERROR] Slave I/O: error connecting to master 'admin@172.29.141.112:3306' - retry-time: 60 retries: 86400, Error_code: 2003

这个就是因为防火墙的问题,所以用 /etc/init.d/iptables stop 关闭防火墙就OK了。

 

4.遇到ERROR 2013 (HY000): Lost connection to MySQL server during query错误。
在/ect/my.cnf的[mysqld]中添加skip-name-resolve
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:502400次
    • 积分:7908
    • 等级:
    • 排名:第2715名
    • 原创:280篇
    • 转载:186篇
    • 译文:0篇
    • 评论:19条
    文章分类
    最新评论