环境 InnoDB备份
[root@centos7 ~]#mysql -e "status"
--------------
mysql Ver 15.1 Distrib 5.5.60-MariaDB, for Linux (x86_64) using readline 5.1
Connection id: 4
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server: MariaDB
Server version: 5.5.60-MariaDB MariaDB Server
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 19 min 24 sec
Threads: 1 Questions: 115 Slow queries: 0 Opens: 8 Flush tables: 2 Open tables: 27 Queries per second avg: 0.098
--------------
[root@centos7 ~]#mysqldump -A -F --single-transaction --master-data=2 --default-character=utf8mb4 > /data/backup/all_bak_`date +%F`.sql
MariaDB [hellodb]> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
+-----+---------------+-----+--------+
4 rows in set (0.01 sec)
MariaDB [hellodb]> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 26792 |
| mysql-bin.000002 | 921736 |
| mysql-bin.000003 | 7270 |
| mysql-bin.000004 | 245 |
+------------------+-----------+
4 rows in set (0.00 sec)
MariaDB [hellodb]> insert teachers(name)value('g');
Query OK, 1 row affected, 1 warning (0.00 sec)
MariaDB [hellodb]> insert teachers(name)value('h');
Query OK, 1 row affected, 1 warning (0.01 sec)
MariaDB [hellodb]> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 26792 |
| mysql-bin.000002 | 921736 |
| mysql-bin.000003 | 7270 |
| mysql-bin.000004 | 627 |
+------------------+-----------+
4 rows in set (0.00 sec)
MariaDB [hellodb]> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
| 5 | g | 0 | NULL |
| 6 | h | 0 | NULL |
+-----+---------------+-----+--------+
6 rows in set (0.01 sec)
[root@centos7 mysql]#rm -rf /var/lib/mysql/*
[root@centos7 mysql]#systemctl restart mariadb
MariaDB [(none)]> set sql_log_bin=off;
Query OK, 0 rows affected (0.01 sec)
MariaDB [(none)]> show variables like 'sql_log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_log_bin | OFF |
+---------------+-------+
1 row in set (0.00 sec)
MariaDB [hellodb]> source /data/backup/all_bak_2019-08-11.sql
MariaDB [test]> use hellodb
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [hellodb]> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
+-----+---------------+-----+--------+
4 rows in set (0.00 sec)
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=245;
[root@centos7 ~]#ll /data/logbin/
total 1884
-rw-rw---- 1 mysql mysql 26792 Aug 11 20:56 mysql-bin.000001
-rw-rw---- 1 mysql mysql 921736 Aug 11 20:56 mysql-bin.000002
-rw-rw---- 1 mysql mysql 7270 Aug 11 21:21 mysql-bin.000003
-rw-rw---- 1 mysql mysql 646 Aug 11 21:29 mysql-bin.000004
-rw-rw---- 1 mysql mysql 26792 Aug 11 21:29 mysql-bin.000005
-rw-rw---- 1 mysql mysql 921736 Aug 11 21:29 mysql-bin.000006
-rw-rw---- 1 mysql mysql 245 Aug 11 21:29 mysql-bin.000007
-rw-rw---- 1 mysql mysql 210 Aug 11 21:29 mysql-bin.index
[root@centos7 logbin]#mysqlbinlog /data/logbin/mysql-bin.00000{4,5,6,7} > incr.sql
还原二进制文件前找到导致数据库错误的注释掉
MariaDB [mysql]> source /data/logbin/incr.sql
MariaDB [hellodb]> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
| 5 | g | 0 | NULL |
| 6 | h | 0 | NULL |
+-----+---------------+-----+--------+
6 rows in set (0.01 sec)
MariaDB [(none)]> set sql_log_bin=on;
Query OK, 0 rows affected (0.01 sec)
还原注意事项:
1.datadir 目录必须为空。除非指定innobackupex --force-non-empty-directorires选项指定,否则–copy-backup选项不会覆盖
2.在restore之前,必须shutdown MySQL实例,不能将一个运行中的实例restore到datadir目录中
3.由于文件属性会被保留,大部分情况下需要在启动实例之前将文件的属主改为mysql,这些文件将属于创建备份的用户
chown -R mysql:mysql /data/mysql
以上需要在用户调用innobackupex之前完成
使用xtrabackup以每周为一个备份周期做备份(数据库+二进制日志,备份至本地/data/backup)
提示: 周一某个时间点做一次完全备份,周二、三、四、五、六、日增量
备份存储目录"/data/backup/2018/52/1/备份数据" 目录解释"/data/backup/年/本年度的第几周/本周的第几天/数据" 一年52周一周7天
(Andy老师提供python备份脚本参考)
#!/bin/bash
for i in `seq 0 6`;do #循环6次
a=/data/backup/`date +%Y`/`date +%U`/ #存储目录变量
mkdir -p $a$i # #创建目录
t=`date +%w` #定义星期
if [ "$t" == "1" ];then #匹配星期 周一为完全备份
xtrabackup --backup --target-dir=/data/backup &> /dev/null && echo backup ok
else
if [ "$t" == "2" ];then #匹配星期 周二为增量备份
xtrabackup --backup --target-dir="$a"1 --incremental-basedir=/data/backup &> /dev/null && echo backup ok
elif [ "$t" == "3" ];then
xtrabackup --backup --target-dir="$a"2 --incremental-basedir="$a"1 &> /dev/null && echo backup ok
elif [ "$t" == "4" ];then
xtrabackup --backup --target-dir="$a"3 --incremental-basedir="$a"2 &> /dev/null && echo backup ok
elif [ "$t" == "5" ];then
xtrabackup --backup --target-dir="$a"4 --incremental-basedir="$a"3 &> /dev/null && echo backup ok
elif [ "$t" == "6" ];then
xtrabackup --backup --target-dir="$a"5 --incremental-basedir="$a"4 &> /dev/null && echo backup ok
elif [ "$t" == "0" ];then
xtrabackup --backup --target-dir="$a"6 --incremental-basedir="$a"5 &> /dev/null && echo backup ok
fi
fi
done
[root@centos7 ~]# crontab -l
0 2 * * * root /root/b.sh
写入计划任务。每晚执行一遍备份。周一则完全备份
当主服务器收到数据更新请求,会写入二进制日志中。在本机中,有一个专门的dump的主服务器线程将二进制日志出来往从服务器线程发。然后发给从服务器。从服务器有一个io thread线程然后写到relay log (类似二进制日志)日志中 。在交给sql thread 在从服务器中更改数据
主从
从服务器设置
清空主服务器的二进制日志后重启
设置从服务器复制数据库账号
主服务器导入数据
从服务器重启数据库服务,添加主信息以及复制用的账号密码
从服务器复制完且已经应用
主从级联
主服务器配置
删库清除二进制日志后重启服务
设置复制帐号
中间从服务器配置
删库清除二进制后重启
设置主,账号密码
末端从服务器配置
删库清二进制重启
设置关系,主为中间从服务器
主主
两边同时更改删除一项会报错,生产中不会同时有2个主
删库清二进制,设置互为主从,自动增长id
建立复制账号
设置关系
半同步复制
删库清二进制
主.17 设置复制账号
从.27 .37 设置关系
主导入数据库同步到从
实现半同步
可以更改超时时长,默认10000毫秒太长了,最好改成1000毫秒
所有从节点设置
主节点查看
所有从节点启动从同步
ps 超时时长可在配置文件中设置
MySQL Proxy处于客户端应用程序和MySQL服务器之间,通过截断、改变并转发客户端和后端数据库之间的通信来实现其功能,这和WinGate 之类的网络代理服务器的基本思想是一样的。代理服务器是和TCP/IP协议打交道,而要理解MySQL Proxy的工作机制,同样要清楚MySQL客户端和服务器之间的通信协议,MySQL Protocol 包括认证和查询两个基本过程
认证过程包括:
客户端向服务器发起连接请求
服务器向客户端发送握手信息
客户端向服务器发送认证请求
服务器向客户端发送认证结果
如果认证通过,则进入查询过程:
客户端向服务器发起查询请求
服务器向客户端返回查询结果
当然,这只是一个粗略的描述,每个过程中发送的包都是有固定格式的,想详细了解MySQL Protocol的同学,可以去这里 看看。MySQL Proxy要做的,就是介入协议的各个过程。首先MySQL Proxy以服务器的身份接受客户端请求,根据配置对这些请求进行分析处理,然后以客户端的身份转发给相应的后端数据库服务器,再接受服务器的信息,返回给客户端。所以MySQL Proxy需要同时实现客户端和服务器的协议。由于要对客户端发送过来的SQL语句进行分析,还需要包含一个SQL解析器。可以说MySQL Proxy相当于一个轻量级的MySQL了,实际上,MySQL Proxy的admin server是可以接受SQL来查询状态信息的
mysql主从搭好
从服务器配置文件必须要有read only
主服务器上
proxysql上
主服务器设置后自动同步到从服务器
proxymysql
6032端口设置实现读写分离
管理主机、主从机时间一直,selinux 防火墙 关闭
主服务器配置
未设置好同步前保持数据库干净
从服务器配置 不清理中继日志,开启二进制日志
所有主从都加上 跳过名字解析
主服务器建立从服务器复制帐号
从服务器设置主服务器
主服务器导入数据库
主服务器上建立MHA管理用户
四台机器相互之间key验证
在管理节点上安装两个包
在被管理节点安装
MHA管理服务器上配置
检查
启动 前台执行,一次性任务 生产中后台运行
都至少需要三个节点,不能安装mariadb-server,安装专门的软件
所有主机都安装相同的软件
修改配置文件
先启动任一一个服务器
剩余服务器用此命令启动