详解MySQL的主从复制、读写分离、备份恢复


本文整理自网络,侵删。

一、MySQL主从复制

1、简介

我们为什么要用主从复制?

主从复制目的:

  • 可以做数据库的实时备份,保证数据的完整性;
  • 可做读写分离,主服务器只管写,从服务器只管读,这样可以提升整体性能。

原理图:

从上图可以看出,同步是靠log文件同步读写完成的。

2、更改配置文件

两天机器都操作,确保 server-id 要不同,通常主ID要小于从ID。一定注意。

# 3306和3307分别代表2台机器
# 打开log-bin,并使server-id不一样
#vim /data/3306/my.cnf
log-bin = /data/3306/mysql-bin
server-id = 1
#vim /data/3307/my.cnf
log-bin = /data/3307/mysql-bin
server-id = 3
#检查
1、
[root@bogon ~]# egrep "log-bin|server-id" /data/3306/my.cnf
log-bin = /data/3306/mysql-bin
server-id = 1
[root@bogon ~]# egrep "log-bin|server-id" /data/3307/my.cnf 
log-bin = /data/3307/mysql-bin
server-id = 3
2、
[root@localhost ~]# mysql -uroot -p -S /data/3306/mysql.sock -e "show variables like 'log_bin';"
Enter password:
+--------+--------+
| Variable_name | Value |
+--------+--------+
| log_bin  | ON | # ON 为开始开启成功
+--------+--------+

3、建立用于从库复制的账号rep

通常会创建一个用于主从复制的专用账户,不要忘记授权。

# 主库授权,允许从库来连接我取日志
[root@localhost ~]# mysql -uroot -p -S /data/3306/mysql.sock
Enter password:
# 允许从库192.168.200网段连接,账号rep,密码nick。
mysql> grant replication slave on *.* to 'rep'@'192.168.200.%' identified by 'nick';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
# 检查创建的rep账号:
mysql> select user,host from mysql.user;
+-----+-------------+
| user | host    |
+-----+--------------+
| root | 127.0.0.1   |
| rep | 192.168.200.%  |
| root | localhost   |
| root | localhost.localdomain |
+-----+------------------+
7 rows in set (0.00 sec)

4、备份主库,及恢复到从库

把主库现有数据备份下来,再恢复到从库,此时两个主机的数据一致。

如果事先有数据的话,这不不能忘。

1)在主库上加锁,使只有只读权限。

mysql> flush table with read lock;
Query OK, 0 rows affected (0.00 sec)
#5.1、5.5锁表命令略有不同。
# 5.1锁表:flush tables with read lock;
# 5.5锁表:flush table with read lock;

2)记住就是这个点备份的。

mysql> show master status;
+-------+------+--------+---------+
| File    | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------+------+--------+---------+
| mysql-bin.000013 | 410 |    |    |
+-------+------+--------+---------+
1 row in set (0.00 sec)

3)克隆窗口,备份数据。

[root@bogon ~]# mysqldump -uroot -p -S /data/3306/mysql.sock -A -B --events --master-data=2|gzip >/opt/rep.sql.gz
Enter password:
参数: -A:备份所有的
#看rep.sql.gz参数
vim /opt/rep.sql.gz
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000013', MASTER_LOG_POS=410;

4)查看master status;数值是否正常。

mysql> show master status;
+------+------+---------+-------+
| File   | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------+-----+---------+--------+
| mysql-bin.000013 | 410 |   |    |
+--------+----+---------+--------+
1 row in set (0.00 sec)

5)解锁库

mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

6)恢复到从库

[root@bogon ~]# gunzip < /opt/rep.sql.gz | mysql -uroot -p -S /data/3307/mysql.sock
Enter password:

5、配置从库及生效

更改从库和主库的连接参数,配置生效。检查就成功了!

1)进入从库。

[root@bogon ~]# mysql -uroot -p -S /data/3307/mysql.sock
Enter password:

2)更改从属服务器用于与主服务器进行连接和通讯的参数。

mysql> CHANGE MASTER TO
  MASTER_HOST='192.168.200.98',
  MASTER_PORT=3306,
  MASTER_USER='rep',
  MASTER_PASSWORD='nick',
  MASTER_LOG_FILE='mysql-bin.000013',
  MASTER_LOG_POS=410;
Query OK, 0 rows affected (0.01 sec) 

3)查看更改的参数。

[root@localhost ~]# cd /data/3307/data/
[root@localhost data]# cat master.info
18
mysql-bin.000013
410
192.168.200.98
REP
nick
3306
60
0
0
1800.000
0

4)生效!

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

5)检查下列参数,符合则正常!

mysql> show slave status\G
Relay_Master_Log_File: mysql-bin.000013
    Slave_IO_Running: Yes  #取logo。
   Slave_SQL_Running: Yes  #读relay-bin、logo,写数据。
Seconds_Behind_Master: 0  #落后主库的秒数。

6)查看relay-bin.logo。

[root@localhost 3307]# cd /data/3307
[root@localhost 3307]# ll
总用量 48
drwxr-xr-x. 9 mysql mysql 4096 10月 29 18:52 data
-rw-r--r--. 1 mysql mysql 1900 10月 29 11:45 my.cnf
-rwx------. 1 root root 1307 10月 20 17:06 mysql
-rw-rw----. 1 mysql mysql  6 10月 29 11:00 mysqld.pid
-rw-r-----. 1 mysql mysql 15090 10月 29 18:49 mysql_nick3307.err
srwxrwxrwx. 1 mysql mysql  0 10月 29 11:00 mysql.sock
-rw-rw----. 1 mysql mysql 150 10月 29 18:49 relay-bin.000001
-rw-rw----. 1 mysql mysql 340 10月 29 18:52 relay-bin.000002
-rw-rw----. 1 mysql mysql 56 10月 29 18:49 relay-bin.index
-rw-rw----. 1 mysql mysql 53 10月 29 18:52 relay-log.info

7)查看relay-log.info。

[root@localhost 3307]# cat relay-log.info
/data/3307/relay-bin.000002
340
mysql-bin.000013
497

8)查看master.info。

[root@localhost 3307]# cat data/master.info
18
mysql-bin.000013
497
192.168.200.98
rep
nick
3306
60
0
0
1800.000
0

6、读写分离

读写分离在生产环境比比皆是,也是必备技能。

忽略MySQL主从复制授权表同步,读写分离。

[root@bogon 3306]# vim my.cnf
#添加以下四行
replicate-ignore-db = mysql
binlog-ignore-db = mysql
binlog-ignore-db = performance_schema
binlog-ignore-db = information_schema
server-id = 1

1)通过read-only参数防止数据写入从库的方法。

#修改配置文件。
vim /data/3307/my.cnf
[mysqld]
read-only
#对用户授权事不能指定有super或all privileges权限。不然没效果。
#创建账户suoning,并刷新权限。
mysql> grant select,insert,update,delete on *.* to 'suoning'@'localhost' identified by '123';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
#用创建账户登录,并创建库
[root@bogon 3307]# mysql -usuoning -p123 -S /data/3307/mysql.sock
mysql> create user kangkangkang@'192.%' identified by 'old123';
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement

2)主从同步故障

A. Last_SQL_Errno: 1007
stop slave;
set global sql_slave_skip_counter = 1;
start slave;
B.忽略
skip-name-resolve  #忽略名字解析
slave-skip-errors = 1032,1062,1007 #忽略故障编号
server-id = 3

3)从库开启bin-log

vim my.cnf
log-bin = /data/3307/mysql-bin
log-slave-updates   #表示从库记录bin-log
expire_logs_days = 7  #保留7天bin-log。

7、主宕机

阅读剩余部分

相关阅读 >>

mysql基础教程之dml语句详解

mysql中的数据类型详解

mysql怎么查看有没有索引?

mysql求2个或以上字段为null值的实例分享

mysql面试笔试题集分享

ddl语句的实例详解

mysql怎么建库?

mysql索引的类型和优缺点详解

mysql和sql是干什么的?

mysql语句查看各个数据库占用空间的方法(附代码)

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...