一、使用mysqldump备份数据库并经过备份及二进制日志还原数据(备份完后再写入数据,而后再删库)mysqldump -A --single-transaction -F --master-data=2 > /data/backup/mysql.sql 选项:-A 备份全部数据库 -F 刷新日志node
--single-stransaction开启事务备份 --master-data=2记录二进制日志位置 备份前的数据库
备份后在表里插入新数据
删库 mysql -e 'drop database hellodb'
开始还原数据库,在还原前临时禁用二进制日志,避免记录还原过程,引发数据错乱
还原数据库 source /data/backup/mysql.sql
查看数据库,彻底备份的数据还原成功
继续还原在彻底备份以后的数据。 查看/backup/mysql.sql文件的二进制日志的记录点
发现最后一次的彻底备份是日志编号06,位置为245。 用mysqlbinlog导出二进制日志
mysqlbinlog /var/lib/mysql/centos7-bin.000006 -v > /data/backup/log.sql 编辑日志,将日志文件中的drop database hellodb 删除 而后在数据库中导入生成的二进制日志。

查看数据库数据,全部数据还原成功。

三、MySQL数据备份企业实战(shell或python脚本实现)mysql
使用xtrabackup以每周为一个备份周期作备份(数据库+二进制日志,备份至本地/data/backup)react
提示: 周一某个时间点作一次彻底备份,周2、3、4、5、6、日增量sql
备份存储目录"/data/backup/2018/52/1/备份数据" 目录解释"/data/backup/年/本年度的第几周/本周的第几天/数据" 一年52周一周7天shell
(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
将脚本写入计划任务。每日2时执行一遍备份。如逢周一则彻底备份
[root@centos7 ~]# crontab -l
0 2 * * * root /root/b.sh &>/dev/null
四、描述MySQL复制工做原理并实现主从,主主,主从级联及半同步复制vim
一台mysql数据库的并发链接数是有限的,当并发访问量大的时候,可能形成一台服务器因为压力太大而形成的宕机,这将产生数据丢失的风险和较差的用户体验。因此,咱们能够利
用mysql的binlog日志和复制功能,组成一台主机,多台从机的集群,当集群中的一台主数据库写入数据时,将主服务器的二进制日志复制到其余从服务器上,继而实现同步过程。
若是主服务器宕机,则自动从多台从服务器挑选一台充当主服务器.
复制原理
当主服务器收到数据更新请求时,会将更新过程写入二进制日志中。在主服务器中,有一个专门的dump线程将二进制日志发给从服务器。从服务器中,有一个io thread线程将接
收到的binlog写入到relay log (相似二进制日志)日志中 ,而后再将relay log交给sql thread在从服务器中更改数据
主从复制
在主服务器配置文件
log-bin=/data/logbin/mysql-bin #启用二进制日志
server-id=1 #指定服务器编号
在从服务器配置
server-id=2 #区别于主服务器编号
read_only=on #为了安全从服务器设置为只读,防止修改
在主服务器建立并受权复制帐号
grant replication slave on *.* to test@'192.168.64.%' identified by 'centos';
主服务器数据库
从服务器数据库
在从服务器执行主服务器修改master 信息
CHANGE MASTER TO
MASTER_HOST='192.168.64.128', #主服务ip
MASTER_USER='test', #用那个帐号复制
MASTER_PASSWORD='centos', #帐户口令
MASTER_PORT=3306, #端口
MASTER_LOG_FILE='mysql-bin.000003', #从那个二进制日志开始复制
MASTER_LOG_POS=245; #从二进制日志的开始内容复制
查看从节点信息
start slave;从服务器执行复制以后就不须要在执行
复制成功

级联复制:
主服务器复制给从服务器,做为中间节点,再经过中间节点从服务器复制给其余从服务器
主服务器的配置文件不变
建立并受权复制帐号
grant replication slave on *.* to test@'192.168.64.%' identified by 'centos';
在中间节点上修改配置文件
加入log_slave_updates将主节点二进制日志记录到本身的日志中
并开启二进制日志,须要将日志复制给下一个节点
修改master to 信息
CHANGE MASTER TO
MASTER_HOST='192.168.64.128',
MASTER_USER='test',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=245;
start slave; 开启复制
主服务器导入表
中间节点开始导入数据
在最后一个节点修改配置文件,关闭二进制日志,从中间节点复制二进制日志
启动数据库,修改master信息为中间节点
CHANGE MASTER TO
MASTER_HOST='192.168.64.130',
MASTER_USER='test',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=245;
同步成功
主主复制:互为主从
容易产生的问题:两台数据库都写入数据,会形成数据不一致,所以慎用
考虑要点:自动增加id
配置一个节点使用奇数id
auto_increment_offset=1 开始点
auto_increment_increment=2 增加幅度
另外一个节点使用偶数id
auto_increment_offset=2
auto_increment_increment=2
修改主配置文件
修改另外一台主配置文件
建立帐号
grant replication slave on *.* to test@'192.168.64.%' identified by 'centos';
在第二台主机修改master 信息
CHANGE MASTER TO
MASTER_HOST='192.168.64.128',
MASTER_USER='test',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=245;
在第一台主机配置
CHANGE MASTER TO
MASTER_HOST='192.168.64.130',
MASTER_USER='test',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=245;
启动复制 start slave;
半同步复制
默认状况下,MySQL的复制功能是异步的,异步复制能够提供最佳的性能,主
库把binlog日志发送给从库即结束,并不验证从库是否接收完毕。这意味着当
主服务器或从服务器端发生故障时,有可能从服务器没有接收到主服务器发送
过来的binlog日志,这就会形成主服务器和从服务器的数据不一致,甚至在恢
复时形成数据的丢失
须要在主服务器安装一个半同步插件模块semisync_master.so';
首先,实现标准的主从复制
而后在主服务器安装插件/usr/lib64/mysql/plugin/semisync_master.so
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
在配置文件加入配置
在从节点安装插件semisync_slave.so
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
并写入配置文件
查看插件状态是否启动
SHOW GLOBAL VARIABLES LIKE '%semi%';
SHOW GLOBAL STATUS LIKE '%semi%';
从新启动线程 stop slave; start slave;实现半同步复制
五、描述MySQL Proxy原理并实现读写分离后端
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来查询状态信息的
在调度器安装proxysql 调度器
配置一下yum源
cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
[proxysql_repo]
name= ProxySQL YUM repository
baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever
gpgcheck=1
gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
EOF
yum install proxysql 安装调度器
调度器配置为数据库方式,因此要启动数据库
启动服务
准备:实现读写分离前,先实现主从复制
注意:slave节点须要设置read_only=1
启动ProxySQL:service proxysql start
启动后会监听两个默认端口
6032:ProxySQL的管理端口
6033:ProxySQL对外提供服务的端口
使用mysql客户端链接到ProxySQL的管理接口6032,默认管理员用户和密码都
是admin:
mysql -uadmin -padmin -P6032 -h127.0.0.1
在数据库中插入数据库服务器的地址和编号,这里编号统一为10,后面会本身识别主从服务器
根据数据库的配置文件read-only这项来区分
MySQL > load mysql servers to runtim
MySQL > save mysql servers to disk;
加载配置并存盘
在主数据库建立帐号让proxysql 监控并自动调整读组和写组
grant replication client on *.* to monitor@'192.168.64.%' identified by 'centos';
在proxysql调度器加入监控帐号和密码。而且加载生效
将都组和写组写入表中。test为描述无关紧要
insert into mysql_replication_hostgroups values(10,20,"test");
分组成功,若是不成功,可手写如记录改变编号
建立测试帐号在主服务器
grant all on *.* to sqluser@'192.168.64.%' identified by 'centos';
在proxysql服务器加入到mysq_user中
在ProxySQL配置,将用户sqluser添加到mysql_users表中, default_hostgroup默认
组设置为写组10,当读写分离的路由规则不符合时,会访问默认组的数据库
insert into mysql_users(username,password,default_hostgroup)values('sqluser','centos',10);
保存并生效
load mysql users to runtim;
save mysql users to disk;
在proxysql调度器上用sqluser帐户链接,利用6033端口。
默认sqluser在10这个主机组。也就是mysql的主数据库 默认全部操做都在主数据库上操做。
配置路由规则。实现读写分离
与规则有关的表:mysql_query_rules和mysql_query_rules_fast_routing,
插入路由规则:将select语句分离到20的读组,select语句中有一个特殊语句
SELECT...FOR UPDATE它会申请写锁,应路由到10的写组
insert into mysql_query_rules
(rule_id,active,match_digest,destination_hostgroup,apply)VALUES
(1,1,'^SELECT.*FOR UPDATE$',10,1),(2,1,'^SELECT',20,1);
##除了读操做发往从节点,其余操做都发往主节点
到此,读写分离配置完成
验证。读为从服务器
mysql -usqluser -pcentos -P6033 -h127.0.0.1 -e 'select @@server_id'
利用事物查看,为主服务器
