mysql复制的优点主要包括以下3个方面:
1.如果主服务器出现问题,可以快速切换到从服务器提供的服务
2.可以在从服务器上执行查询操作,降低主服务器的访问压力
3.可以在从服务器上执行备份,以避免备份期间影响主服务器的服务
注意:一般只有更新不频繁的数据或者对实时性要求不高的数据可以通过从服务器查询,实时性要求高的数据仍然需要从主服务器获得
主服务器配置
我的服务器采用yum安装,如果想配置文件
设置默认编码等一些初始参数(my.cnf)(若无my.cnf, 则可cp /usr/share/mysql/my-small.cnf /etc/my.cnf)
前期准备数据:
两台服务器
master:192.168.1.111(主服务器)
slave:192.168.1.112(从服务器)
网络互通(关闭防火墙,关闭selinux)具体方法请看链接
一、主从服务器分别作以下操作
1.1、版本一致
1.2、初始化表,并在后台启动mysql
1.3、修改root的密码(新安装的mysql没有密码)
二、mysql主服务器配置master(192.168.1.111)
1)修改主服务器master:
|
#vi /etc/my.cnf
[
mysqld
]
log
-
bin
=
mysql
-
bin
#[必须]启用二进制日志
server
-
id
=
1
#[必须]服务器唯一ID,默认是1
expire
-
logs
-
days
=
7
#只保留7天的二进制日志,以防磁盘被日志占满
replicate
-
do
-
db
=
test
#需要做复制的数据库名
binlog
-
ignore
-
db
=
mysql
#不备份的数据库
binlog
-
ignore
-
db
=
information_schema
|
2)给从服务器设置授权用户(创建复制帐号)
|
mysql
>
grant
replication
slave
on *
.
*
to
'mysync'
@
'192.168.1.112'
identified
by
'123456'
;
mysql
>
flush
privileges
;
|
建立一个帐户mysync,并且只能允许从192.168.1.112这个地址上来登陆,密码是123456。
(如果因为mysql版本新旧密码算法不同,可以设置:set password for ‘mysync’@’192.168.1.112’=old_password(‘123456’))
3)在主服务器上设置读取锁定有效,确保没有数据库操作,以便获得一个一致性的快照
|
mysql
>
flush
tables
with
read
lock
;
|
4)查看主服务器上当前的二进制日志名和偏移量值
|
mysql
>
show
master
status
;
+
--
--
--
--
--
--
--
--
--
+
--
--
--
--
--
+
--
--
--
--
--
--
--
+
--
--
--
--
--
--
--
--
--
+
|
File
|
Position
|
Binlog_Do_DB
|
Binlog_Ignore_DB
|
+
--
--
--
--
--
--
--
--
--
+
--
--
--
--
--
+
--
--
--
--
--
--
--
+
--
--
--
--
--
--
--
--
--
+
|
mysql
-
bin
.
000001
|
106
|
|
|
+
--
--
--
--
--
--
--
--
--
+
--
--
--
--
--
+
--
--
--
--
--
--
--
+
--
--
--
--
--
--
--
--
--
+
|
5)目前主数据库服务器已经停止了更新操作,生成主数据库的备份,备份的方式有两种:
(1)cp全部的数据
如果主数据库的服务可以停止,那么直接cp数据文件应该最快的生成快照的方法:
(2)mysqldump备份数据方法
[root@localhost ~]# /usr/bin/mysqldump -uroot -p123456 test -l -F >/tmp/test.sql
6)主数据库备份完毕后,主数据库可以恢复写操作,剩下的操作只需要在从服务器上去执行:
mysql> unlock tables;
7)把主数据库的一致性备份恢复到从数据库上,把以上的压缩包解压到相应的目录即可
三、mysql从服务器配置slave(192.168.1.112)
1)修改从服务器slave:
|
#vi /etc/my.cnf
[
mysqld
]
log
-
bin
=
mysql
-
bin
#[必须]启用二进制日志
server
-
id
=
2
#[必须]服务器唯一ID,默认是1
replicate
-
do
-
db
=
test
#需要做复制的数据库名
replicate
-
ignore
-
table
=
information_schema
#自动跳过的表
binlog
-
ignore
-
db
=
mysql
#不备份的数据库
read_only
=
1
#只读属性
|
2)将主库上备份的数据库恢复到从库(导入之前备份数据)
|
mysql
>
mysql
-
uroot
-
p123456
test
-
v
-
f
<
/
tmp
/
test
.
sql
|
-v查看导入的详细信息
-f是当中间遇到错误时,可以skip过去,继续执行下面的语句
3)重启从库MYSQL
4)登录从库的MySQL命令行,执行:
|
mysql
>
change
master
to
master_host
=
'192.168.1.111'
,
master_user
=
'mysync'
,
master_password
=
'123456'
,
master_log_file
=
'mysql-bin.000001'
,
master_log_pos
=
106
;
|
5)启动从库连接,执行:
|
mysql
>
start
slave
;
#启动从库连接
|
6)查看从库状态:
|
mysql
>
show
slave
status
\
G
;
#查看连接情况
Slave_IO_Running
:
Yes
Slave_SQL_Running
:
Yes
|
如果有出现以上结果,则配置成功
binlog日志用于记录所有更新了数据或者已经潜在更新了数据的所有语句。语句以“事件”的形式保存,它描述数据更改。当我们因为某种原因导致数据库出现故障时,就可以利用binlog日志来挽回(前提是已经配置好了binlog),接下来我们来配置
一、开启mysql-binlog日志
在mysql配置文件my.cnf加上如下配置
|
[
mysqld
]
log
-
bin
=
mysql
-
bin
|
重启mysql
二、备份数据库
1)先查看一下当前数据库情况
|
mysql
>
select *
from
t1
;
+
--
--
--
+
|
id
|
+
--
--
--
+
|
1
|
|
2
|
+
--
--
--
+
2
rows
in
set
(
0.00
sec
)
|
2)备份数据到/tmp/test.sql
|
[
root
@
localhost
~
]
# whereis mysqldump
mysqldump
:
/
usr
/
bin
/
mysqldump
/
usr
/
share
/
man
/
man1
/
mysqldump
.
1.gz
[
root
@
localhost
~
]
# /usr/bin/mysqldump -uroot -p123456 test > /tmp/test.sql
|
三、这时模拟误操作(插入3条数据,删除数据库)
|
mysql
>
insert
into
t1
values
(
3
)
;
Query
OK
,
1
row
affected
(
0.00
sec
)
mysql
>
insert
into
t1
values
(
4
)
;
Query
OK
,
1
row
affected
(
0.00
sec
)
mysql
>
insert
into
t1
values
(
5
)
;
Query
OK
,
1
row
affected
(
0.00
sec
)
mysql
>
flush
logs
;
#关闭当前的二进制日志文件并创建一个新文件,新的二进制日志文件的名字在当前的二进制文件的编号上加1。
Query
OK
,
0
rows
affected
(
0.05
sec
)
|
|
mysql
>
show
master
status
;
+
--
--
--
--
--
--
--
--
--
+
--
--
--
--
--
+
--
--
--
--
--
--
--
+
--
--
--
--
--
--
--
--
--
+
|
File
|
Position
|
Binlog_Do_DB
|
Binlog_Ignore_DB
|
+
--
--
--
--
--
--
--
--
--
+
--
--
--
--
--
+
--
--
--
--
--
--
--
+
--
--
--
--
--
--
--
--
--
+
|
mysql
-
bin
.
000002
|
106
|
|
|
+
--
--
--
--
--
--
--
--
--
+
--
--
--
--
--
+
--
--
--
--
--
--
--
+
--
--
--
--
--
--
--
--
--
+
1
row
in
set
(
0.01
sec
)
|
删除数据
1
2
3
4
5
6
7
8
9
10
11
12
13
|
mysql
>
truncate
t1
;
Query
OK
,
0
rows
affected
(
0.00
sec
)
mysql
>
select *
from
t1
;
Empty
set
(
0.01
sec
)
mysql
>
show
tables
;
+
--
--
--
--
--
--
--
--
+
|
Tables_in_test
|
+
--
--
--
--
--
--
--
--
+
|
t1
|
+
--
--
--
--
--
--
--
--
+
1
row
in
set
(
0.00
sec
)
|
此时突然数据库损坏或者人为删除
|
mysql
>
drop
table
t1
;
Query
OK
,
0
rows
affected
(
0.00
sec
)
mysql
>
show
tables
;
Empty
set
(
0.00
sec
)
|
四、此时数据库已经被完全破坏
1)用已经备份的/tmp/test.sql来恢复数据
|
[
root
@
localhost
]
# mysql -uroot -p123456 test </tmp/test.sql
[
root
@
localhost
]
# mysql -uroot -p123456 test
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
mysql
>
show
tables
;
+
--
--
--
--
--
--
--
--
+
|
Tables_in_test
|
+
--
--
--
--
--
--
--
--
+
|
t1
|
+
--
--
--
--
--
--
--
--
+
1
row
in
set
(
0.00
sec
)
mysql
>
select *
from
t1
;
+
--
--
--
+
|
id
|
+
--
--
--
+
|
1
|
|
2
|
+
--
--
--
+
2
rows
in
set
(
0.00
sec
)
|
2)还有三条数据没有恢复,怎么办。只能用bin-log来恢复
|
[
root
@
localhost
]
# /usr/bin/mysqlbinlog --no-defaults /var/lib/mysql/mysql-bin.000001 | more
[
root
@
localhost
]
# /usr/bin/mysqlbinlog --no-defaults /var/lib/mysql/mysql-bin.000001 | /usr/bin/mysql -uroot -p123456 test
|
|
mysql
>
select *
from
t1
;
+
--
--
--
+
|
id
|
+
--
--
--
+
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
+
--
--
--
+
5
rows
in
set
(
0.00
sec
)
|
3)恢复成功
【总结】:mysql备份和bin-log日志
备份数据:
|
mysqldump
-
uroot
-
p123456
test
-
l
-
F
'/tmp/test.sql'
-
l
:读锁(只能读取,不能更新)
-
F
:即
flush
logs,可以重新生成新的日志文件,当然包括
log
-
bin日志
|
查看binlog日志:
|
mysql
>
show
master
status
|
导入之前备份数据:
|
mysql
-
uroot
-
p123456
test
-
v
-
f
<
/
tmp
/
test
.
sql
-
v查看导入的详细信息
-
f是当中间遇到错误时,可以
skip过去,继续执行下面的语句
|
恢复binlog-file二进制日志文件:
|
mysqlbinlog
--
no
-
defaults
binlog
-
file
|
mysql
-
uroot
-
p123456
|
从某一(367)点开始恢复:
|
mysqlbinlog
--
no
-
defaults
--
stop
-
position
=
"367"
mysql
-
bin
.
000001
|
mysql
-
uroot
-
p123456
test
|
先查好那一点(用more来查看)
|
[
root
@
localhost
mysql
]
# /usr/bin/mysqlbinlog --no-defaults mysql-bin.000002 --start-position="794" --stop-position="1055" | more
|
然后恢复:
|
[
root
@
localhost
mysql
]
# /usr/bin/mysqlbinlog --no-defaults mysql-bin.000002 --start-position="794" --stop-position="1055" | /usr/bin/mysql -uroot -p123456 test
|
重置binlog日志
|
mysql
>
reset
master
;
Query
OK
,
0
rows
affected
(
0.01
sec
)
mysql
>
show
master
status
;
+
--
--
--
--
--
--
--
--
--
+
--
--
--
--
--
+
--
--
--
--
--
--
--
+
--
--
--
--
--
--
--
--
--
+
|
File
|
Position
|
Binlog_Do_DB
|
Binlog_Ignore_DB
|
+
--
--
--
--
--
--
--
--
--
+
--
--
--
--
--
+
--
--
--
--
--
--
--
+
--
--
--
--
--
--
--
--
--
+
|
mysql
-
bin
.
000001
|
106
|
|
|
+
--
--
--
--
--
--
--
--
--
+
--
--
--
--
--
+
--
--
--
--
--
--
--
+
--
--
--
--
--
--
--
--
--
+
|
mysql> flush logs;#关闭当前的二进制日志文件并创建一个新文件,新的二进制日志文件的名字在当前的二进制文件的编号上加1。