day05数据备份与恢复
一数据备份相关概念
1.1 数据备份的目的? 数据被误删除 或 设备损害导致数据丢失 ,是备份文件恢复数据。
1.2数据备份方式?
物理备份: 指定备份库和表对应的文件 直接拷贝
cp -r /var/lib/mysql /databak/mysql.bak
chown -R mysql:mysql /var/lib/mysql/bbsdb
systemctl restart mysqld
51 scp /opt/mysql.bak 192.168.4.51:/root/
cp -r /root/mysql.bak /var/lib/mysql
chown -R mysql:mysql /var/lib/mysql
systemctl restart mysqld
逻辑备份: 在执行备份命令时,根据备份的库表及数据生成对应的sql命令,把sql存储到指定的文件里。
mysqldump备份 mysql恢复
1.3数据备份策略?
完全备份mysqldump备份所有数据(一张表的所有数据一个库的所有数据一台数据库的所有数据)
备份新产生数据(差异备份 和 增量备份 都备份新产生的数据 )
差异备份 备份自完全备份后,所有新产生的数据。
增量备份 备份自上次备份后,所有新产生的数据。
1.4工作中如何对数据做备份?
1.4.1 选择备份策略:
完全备份+差异备份
完全备份+增量备份 锁表 备份考虑的问题 数据存储空间 备份文件名
1.4.2 数据备份时间 数据服务器访问量少的时候执行备份
1.4.3 数据备份频率 根据数据产生量,决定备份频率
1.4.4 备份文件的命名 库名-日期.sql
1.4.5 备份文件的存储设置 准备独立的存储设备存储备份文件
1.4.6 如何执行备份 使用周期性计划任务执行本机脚本
完全备份+差异备份
06:00 t1 文件名 数据
1 完全 10 1.sql 10
2 差异 3 2.sql 3
3 5 3.sql 8
4 2 4.sql 12
5 7 5.sql 17
6 4 6.sql 21
7 差异 1 7.sql 22
完全备份+增量备份mysqldump innobackupex
06:00 t1 文件名 数据
1 完全 10 1.sql 10
2 增量 3 2.sql 3
3 5 3.sql 5
4 2 4.sql 2
5 7 5.sql 7
6 4 6.sql 4
7 增量 1 7.sql 1
+++++++++++++++++++++++++++++
二完全备份与完全恢复
2.1 完全备份数据 crond + 备份脚本
]# mkdir -p /mydatabak
]# mysqldump -uroot -p654321 studb > /mydatabak/studb.sql
]# mysqldump -uroot -p654321 db3 user3 > /mydatabak/db3-user3.sql
]#cat /mydatabak/studb.sql
]#cat /mydatabak/db3-user3.sql
2.3 完全恢复数据
]# mysql -uroot -p654321 studb < /mydatabak/studb.sql
]# mysql -uroot -p654321 db3 < /mydatabak/db3-user3.sql
使用source 命令恢复数据
mysql> create database bbsdb;
mysql> use bbsdb;
mysql> source /mydatabak/studb.sql
每周一晚上18:00备份studb库的所有数据到本机的/dbbak目录下,备份文件名称要求如下 日期_库名.sql。
]#vim /root/bakstudb.sh
#!/bin/bash
day=`date +%F`
if [ ! -e /dbbak ];then
mkdir /dbbak
fi
mysqldump -uroot -p654321 studb > /dbbak/${day}_studb.sql
:wq
数据完全备份 mysqldump -u -p 数据库名> 目录名/文件名.sql
--all-databases 或 -A(所有库) 数据库名(所有表) 数据库 表名(表记录)
]# chmod +x /root/bakstudb.sh
]#/root/bakstudb.sh
]# ls /dbbak/*.sql
]#crontab -e
00 18 * * 1 /root/bakstudb.sh &> /dev/null
00 18 * * 2-7 /root/newbak.sh 增量
systemctl enable crond
:wq
单独恢复库的数据要先建库名,恢复表是直接可以的
3.1 启动mysql数据库服务的binlog日志文件 实现实时增量备份
3.1.1 binlog日志介绍:是mysql数据库服务日志文件的一种,默认没有启用。记录除查询之外的sql命令。
查询命令例如: select show desc 不记录日志的查询内容
写命令例如: insert update delete create drop
3.1.2 启用binlog日志
]#vim /etc/my.cnf
[mysqld]
server_id=51
log-bin 启用日志默认row
binlog-format="mixed"
:wq
]# systemctl restart mysqld
]# ls /var/lib/mysql/主机名-bin.000001
]# cat /var/lib/mysql/主机名-bin.index
3.1.3 查看binlog日志文件内容
]#mysqlbinlog /var/lib/mysql/mysql51-bin.000001
****可以自定义binlog日志文件存储的位置和文件名称
]#mkdir /mylog
]#chown mysql /mylog
]#setenforce 0
]#vim /etc/my.cnf
[mysqld]
server_id=51
#log-bin
log-bin=/mylog/plj 路径 名字 要创建文件
binlog-format="mixed"
:wq
]# systemctl restart mysqld
]#ls /mylog/plj.*
plj.000001 plj.index
mysqlbinlong plj. |grep -i insert
3.1.4 手动生成新的日志文件方法
*默认日志文件大于500M时自动创建新日志文件
]# systemctl restart mysqld
mysql> flush logs;
]# mysql -uroot -p密码 -e "flush logs" -e选项简单sql命令 "show databases"
]# mysqldump -uroot -p密码 --flush-logs 库名 > 目录/xx.sql
增加新的日志
使用一个新的日志文件 记录 新创建的webdb库的初始操作。
mysql> flush logs;
mysql> create database webdb; create table webdb.a(id int);
mysql> insert into webdb.a values(100);
mysql> insert into webdb.a values(101);
mysql> flush logs; 单独生成库日志命令
删除webdb库,使用 binlog日志文件恢复webdb库的数据。
mysql> drop database webdb;
3.1.7 使用binlog日志恢复数据
]#mysqlbinlog /mylog/plj.000008 | mysql -uroot -p654321
3.1.5 删除已有的binlog日志文件
mysql> purge master logs to "binlog文件名;
删除指定日志文件之前的日志文件
mysql> purge master logs to "plj.000005";
mysql> reset master ; 删除所有的日志文件重新生成第一个日志文件
mysql> show master status; 显示当前正在使用的binlog日志信息
]#mysqlbinlog 日志文件名;
3.1.6 binlog日志记录sql命令方式
记录方式有2种: 偏移量 、记录sql命令执行的时间
指定偏移量范围选项
--start-position=偏移量的值
--stop-position=偏移量的值
指定时间范围选项
--start-datetime="yyyy-mm-dd hh:mm:ss"
--stop-position="yyyy-mm-dd hh:mm:ss"
++++++++++++++++++++++++
读取日志文件指定范围内的sql命令恢复数据。
]# mysqlbinlog --start-position=293 --stop-position=1450 plj.000001 | mysql -uroot -
p654321
++++++++++++++++++++++++++++
]#mysqldump -uroot -p654321 --flush-logs db3.user3 > /root/user3.sql
mysql> insert into db3.user3 values("a","b","c");
mysql> insert into db3.user3 values("aa","b","c");
mysql> insert into db3.user3 values("ab","b","c");
mysql> insert into db3.user3 values("ac","b","c");
mysql> delete from db3.users;
mysql> select * from db3.user3;
]#mysql -uroot -p654321 db3 < /root/user3.sql
mysql> select * from db3.user3;
]#mysqlbinlog --start-position=偏移量的值
--stop-position=偏移量的值 日志文件名 | mysql -uroot -p654321
mysql> select * from db3.user3;
+++++++++++++++++++++++++++++++++
3.2 安装第3方软件提供备份命令,对数据做增量备份
软件介绍 Percona 开源软件 在线热备不锁表 适用于生成环境。
婆堪呢
安装软件
]# rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm
]# yum -y install perl-DBD-mysql perl-Digest-MD5
]# rpm -ivh percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm
]# rpm -ql percona-xtrabackup-24
提供2个备份命令man innobackupexqsys
/usr/bin/innobackupex命令集成了命令xtrabackup,所以可以支持MYISAM存储引擎
/usr/bin/xtrabackup命令仅支持InnoDB和XtraDB存储引擎的表
innobackupex备份命令的使用格式?
]#innobackupex <选项>
]# man innobackupex
mysql 用户密码
performance_schema视图
sys 系统
常用选项?
--user 用户名
--password 密码
--databases="库名"
"库名1 库名2"
"库名.表名"
--no-timestamp 不使用时间戳做备份文件的子目录名
+++++++++++++++innobackupex完全备份 与 完全恢复
]# innobackupex --user root --password 654321 \
--databases="mysql performance_schema sys gamedb" /allbak --no-timestamp
++++++++++++++完全恢复
--copy-back
]# rm -rf /var/lib/mysql
]# mkdir /var/lib/mysql
]# innobackupex --user root --password 654321 --copy-back /allbak
]# chown -R mysql:mysql /var/lib/mysql
]# systemctl restart mysqld
]#mysql -uroot -p654321
mysql> show databases;
mysql> select * from gmaedb.t1;
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
事务日志文件cat xtrabackup_checkpoints
LSN 日志序列号
ibdata1
xtrabackup_logfile
innobackupex --user root --password 123456--databases=" mysql performance_schema sys db" --apply-log /allbak --no-timestamp
--apply-log 回滚日志
--copy-back拷贝
清空目录
chown -R mysql:mysql /var/lib/mysql
重起
增量备份的工作过程?
每一个备份目录下,都有记录当前目录备份信息的配置文件
]# cat 备份目录名/xtrabackup_checkpoints (记录备份类型 和lsn范围)
+++++++++innobackupex增量备份与恢复
--incremental 目录名 #增量备份
--incremental-basedir=目录名 #增量备份时,指定上一次备份文件存储的目录名
innobackupex --user root --password 123456 --databases=" mysql performance_schema sys " --incremental /new1dir --incremental-basedir=/allbak --no-timestamp
先要有一次完全备份 存放目录 /fullbak
]# innobackupex --user root --password 654321 \
--databases="gamedb mysql performance_schema sys" \
/fullbak --no-timestamp
插入新记录,执行增量备份 存放目录 /new1bak
mysql> insert into gamedb.t1 values(8080),(8080);
]# innobackupex --user root --password 654321 \
--databases="gamedb mysql performance_schema sys" \
--incremental /new1dir --incremental-basedir=/fullbak --no-timestamp
插入新记录,执行增量备份 存放目录 /new2bak
]# innobackupex --user root --password
--databases="mysql performance_schema sys"
--incremental /new2dir --incremental-basedir=/new1dir --no-timestamp
++++++++++++++增量恢复
--apply-log 准备恢复数据
--redo-only 合并日志
--incremental-dir=目录名 #增量恢复数据时,指定备份目录名称
--copy-back 恢复数据
清空数据库目录
]# rm -rf /var/lib/mysql
]# mkdir /var/lib/mysql
准备恢复数据
]# innobackupex --user root --password
--databases= "mysql performance_schema sys"
--apply-log /fullbak
合并日志
]# innobackupex --user root --password 654321 \
--databases="gamedb mysql performance_schema sys" \
--apply-log --redo-only /fullbak --incremental-dir=/new1dir
]# innobackupex --user root --password 654321 \
--databases="gamedb mysql performance_schema sys" \
--apply-log --redo-only /fullbak --incremental-dir=/new2dir
拷贝备份文件到数据库目录
]# innobackupex --user root --password 654321 \
--databases="gamedb mysql performance_schema sys" \
--copy-back /fullbak
]# ls /var/lib/mysql -l
修改文件的所有者/组mysql
]# chown -R mysql:mysql /var/lib/mysql
重启数据库服务
]# systemctl restart mysqld
]# mysql -uroot -p654321
+++++++++++++++++++++使用完全备份文件恢复单个表
--export 导出表信息
mysql> alter table 库.表 discard tablespace; 删除表空间
mysql> alter table 库.表 import tablespace; 导入表空间
1完全备份
]# innobackupex --user root --password 654321 \
--databases="studb" /allbakstudb --no-timestamp
2查看备份目录文件列表
system 在数据库打命令
]# ls /allbakstudb
]# ls /allbakstudb/studb
3误删除a表: mysql> drop table studb.a;
4 使用完全备份文件恢复单个表
4.1 按照备份时的表结构创建删除的表
create table studb.a(name char(10));
4.2 删除创建表的表空间文件
mysql> alter table studb.a discard tablespace;
4.3 使用备份文件导出表信息
]#innobackupex --user root --password 654321 \
--databases="studb" --apply-log --export /allbakstudb
4.4 把导出的表信息文件,拷贝到对应的数据库目录下,并修改所有者和组为mysql
]# cp /allbakstudb/studb/a.{cfg,exp,ibd} /var/lib/mysql/studb/
]# chown mysql:mysql /var/lib/mysql/studb/a.*
4.5 导入表空间
mysql> alter table studb.a import tablespace;
[root@mysql51 ~]# rm -rf /var/lib/mysql/studb/a.cfg
[root@mysql51 ~]# rm -rf /var/lib/mysql/studb/a.exp
4.6 查看记录
mysql> select * from studb.a;
2.3 配置mysql主从同步
启用binlog日志 做用户授权 show master status;
指定server_id 指定主数据库服务器的信息 启动slave进程
公共配置ping通
2.3.1 配置主库 (192.168.4.51)master slave
show master status;
a 做用户授权
grant replication slave on *.* to yaya@"%" identified by "123456";
b 启用binlog日志
vim /etc/my.cnf
[mysqld]
server_id=51
log-bin=master51
binlog-format="mixed"
:wq
]# systemctl restart mysqld
]# ls /var/lib/mysql/master51.*
/var/lib/mysql/master51.000001 /var/lib/mysql/master51.index
c 查看正在使用binlog日志信息
]#mysql -uroot -p123456
mysql> show master status;
2.3.2 配置从库
a 验证主库的用户授权
]# mysql -h192.168.4.51 -urepluser -p123456
mysql> show grants;
mysql> quit;
b 指定server_id
]# vim /etc/my.cnf
[mysqld]
server_id=52
:wq
]# systemctl restart mysqld
c数据库管理员本机登录,指定主数据库服务器的信息
]#mysql -uroot -p123456
change master to
master_host="192.168.4.62",
master_user="abc",
master_password="123456",
master_log_file="master62.000001",
master_log_pos=154;
d 启动slave进程
mysql> start slave;
e查看进程状态信息
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
stop slave
host62-relay-bin.*
host62-relay-bin.index
master.info
relay-log.info
show processlist;进程列表
2.4 在客户端测试主从同步配置
2.4.1 在主库服务器上添加访问数据时,使用连接用户
]# mysql -uroot -p123456
mysql> grant all on bbsdb.* to webadmin@"%" identified by "123456";
mysql>select user,host from mysql.user where user="webadmin";
mysql> quit;
2.4.2 客户端使用主库的授权用户,连接主库服务器,建库表插入记录
254]# mysql -h192.168.4.51 -uwebadmin -p123456
mysql> 建库 建表 插入记录
2.4.3 在从库本机,使用管理登录查看是否有和主库一样库表记录及授权用户
52]# mysql -uroot -p123456
mysql> select * from 库.表;
2.4.4 客户端使用主库的授权用户,连接从库服务器,也可以看到新建的库表及记录
254]# mysql -h192.168.4.52 -uwebadmin -p123456
mysql> select * from 库.表;
+++++++++++配置mysql主从从结构
主库 192.168.4.51
从库 192.168.4.52 ( 做51主机从库)
从库 192.168.4.53 ( 做53主机从库)
要求:客户端访问主库51 时 创建库表记录 在52 和53 数据库服务器都可以看到
配置步骤:
一、环境准备
主从同步未配置之前,要保证从库上要有主库上的数据。
禁用selinux ]# setenforce 0
关闭防火墙服务]# systemctl stop firewalld
物理连接正常 ]# ping -c 2 192.168.4.51/52
数据库正常运行,管理可以从本机登录
二、配置主从同步
2.1 配置主库51
2.1.1 用户授权
]#mysql -uroot -p123456
mysql> grant replication slave on *.* to yaya@"%" identified by "123456";
2.1.2 启用binlog日志
vim /etc/my.cnf
server_id=51
log-bin=db51
binlog-format="mixed"
:wq
]# systemctl restart mysqld
[root@db51 ~]# ls /var/lib/mysql/db51.*
/var/lib/mysql/db51.000001 /var/lib/mysql/db51.index
2.1.3 查看正在使用的日志信息
]#mysql -uroot -p123456
mysql> show master status;
+-------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------+----------+--------------+------------------+-------------------+
| db51.000001 | 154 | | | |
+-------------+----------+--------------+------------------+-------------------+
2.2 配置从库52
用户授权
]#mysql -uroot -p123456
mysql> grant replication slave on *.* to yaya@"%" identified by "123456";
启用binlog日志,指定server_id 和 允许级联复制
]# vim /etc/my.cnf
[mysqld]
server_id=52
log-bin=db52
binlog-format="mixed"
log_slave_updates
:wq
]# systemctl restart mysqld
[root@db52 ~]# ls /var/lib/mysql/db52.*
查看正在使用的日志信息
]#mysql -uroot -p123456
mysql> show master status;
+-------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------+----------+--------------+------------------+-------------------+
| db52.000001 | 154 | | | | |
+-------------+----------+--------------+------------------+-------------------+
binlog_do_db=name
binlog_ignore_db=name
log_slave_updates
relay_log=dbsvr2-relay-bin
replicate_do_db=mysql
replicate_ignore_db=test
验证主库的授权用户
]# mysql -h192.168.4.51 -uyaya -p123456
mysql> quit;
管理员登录指定主库信息
~]# mysql -uroot -p123456
change master to
master_host="192.168.4.62",
master_user="yaya",
master_password="123456",
master_log_file="master62.000006",
master_log_pos=154;
启动slave进程
mysql> start slave;
查看进程状态信息
mysql> show slave status \G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
2.3 配置从库53
2.3.1验证主库的授权用户
]#mysql -h192.168.4.52 -uuser53 -p654321
mysql> quit;
2.3.2 指定server_id
]# vim /etc/my.cnf
[mysqld]
server_id=53
:wq
]# systemctl restart mysqld
2.3.3 管理员登录指定主库信息
change master to
master_host="192.168.4.63",
master_user="yaya",
master_password="123456",
master_log_file="db63.000001",
master_log_pos=154;
2.3.4 启动slave进程
mysql> start slave;
2.3.5 查看进程状态信息
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
三、客户端验证配置
3.1 在主库上授权访问gamedb库的用户
mysql> grant all on gamedb.* to dada@"%" identified by "123456";
3.2 客户端使用授权用户连接主库,建库、表、插入记录
]# mysql -h192.168.4.51 -udada -p123456
create database gamedb;
create table gamedb.t1(id int);
insert into gamedb.t1 values(8888);
create table gamedb.t2(id int);
insert into gamedb.t2 values(99999);
select * from gamedb.t1;select * from gamedb.t2;
3.3 客户端使用授权用户连接2台从库时,也可以看到主库上新的库表记录
]# mysql -h192.168.4.52 -udada -p123456
select * from gamedb.t1;select * from gamedb.t2;
]# mysql -h192.168.4.53 -udada -p123456
select * from gamedb.t1;select * from gamedb.t2;
show variables like "have_dynamic_loading";
show variables like "rpl_semi_sync_ %_enabled";
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1
plugin-load = "rpl_semi_sync_master=semisync_master.so;
rpl_semi_sync_slave=semisync_slave.so“
rpl-semi-sync-master-enabled = 1
rpl-semi-sync-slave-enabled = 1
一数据备份相关概念
1.1 数据备份的目的? 数据被误删除 或 设备损害导致数据丢失 ,是备份文件恢复数据。
1.2数据备份方式?
物理备份: 指定备份库和表对应的文件 直接拷贝
cp -r /var/lib/mysql /databak/mysql.bak
chown -R mysql:mysql /var/lib/mysql/bbsdb
systemctl restart mysqld
51 scp /opt/mysql.bak 192.168.4.51:/root/
cp -r /root/mysql.bak /var/lib/mysql
chown -R mysql:mysql /var/lib/mysql
systemctl restart mysqld
逻辑备份: 在执行备份命令时,根据备份的库表及数据生成对应的sql命令,把sql存储到指定的文件里。
mysqldump备份 mysql恢复
1.3数据备份策略?
完全备份mysqldump备份所有数据(一张表的所有数据一个库的所有数据一台数据库的所有数据)
备份新产生数据(差异备份 和 增量备份 都备份新产生的数据 )
差异备份 备份自完全备份后,所有新产生的数据。
增量备份 备份自上次备份后,所有新产生的数据。
1.4工作中如何对数据做备份?
1.4.1 选择备份策略:
完全备份+差异备份
完全备份+增量备份 锁表 备份考虑的问题 数据存储空间 备份文件名
1.4.2 数据备份时间 数据服务器访问量少的时候执行备份
1.4.3 数据备份频率 根据数据产生量,决定备份频率
1.4.4 备份文件的命名 库名-日期.sql
1.4.5 备份文件的存储设置 准备独立的存储设备存储备份文件
1.4.6 如何执行备份 使用周期性计划任务执行本机脚本
完全备份+差异备份
06:00 t1 文件名 数据
1 完全 10 1.sql 10
2 差异 3 2.sql 3
3 5 3.sql 8
4 2 4.sql 12
5 7 5.sql 17
6 4 6.sql 21
7 差异 1 7.sql 22
完全备份+增量备份mysqldump innobackupex
06:00 t1 文件名 数据
1 完全 10 1.sql 10
2 增量 3 2.sql 3
3 5 3.sql 5
4 2 4.sql 2
5 7 5.sql 7
6 4 6.sql 4
7 增量 1 7.sql 1
+++++++++++++++++++++++++++++
二完全备份与完全恢复
2.1 完全备份数据 crond + 备份脚本
]# mkdir -p /mydatabak
]# mysqldump -uroot -p654321 studb > /mydatabak/studb.sql
]# mysqldump -uroot -p654321 db3 user3 > /mydatabak/db3-user3.sql
]#cat /mydatabak/studb.sql
]#cat /mydatabak/db3-user3.sql
2.3 完全恢复数据
]# mysql -uroot -p654321 studb < /mydatabak/studb.sql
]# mysql -uroot -p654321 db3 < /mydatabak/db3-user3.sql
使用source 命令恢复数据
mysql> create database bbsdb;
mysql> use bbsdb;
mysql> source /mydatabak/studb.sql
每周一晚上18:00备份studb库的所有数据到本机的/dbbak目录下,备份文件名称要求如下 日期_库名.sql。
]#vim /root/bakstudb.sh
#!/bin/bash
day=`date +%F`
if [ ! -e /dbbak ];then
mkdir /dbbak
fi
mysqldump -uroot -p654321 studb > /dbbak/${day}_studb.sql
:wq
数据完全备份 mysqldump -u -p 数据库名> 目录名/文件名.sql
--all-databases 或 -A(所有库) 数据库名(所有表) 数据库 表名(表记录)
]# chmod +x /root/bakstudb.sh
]#/root/bakstudb.sh
]# ls /dbbak/*.sql
]#crontab -e
00 18 * * 1 /root/bakstudb.sh &> /dev/null
00 18 * * 2-7 /root/newbak.sh 增量
systemctl enable crond
:wq
单独恢复库的数据要先建库名,恢复表是直接可以的
3.1 启动mysql数据库服务的binlog日志文件 实现实时增量备份
3.1.1 binlog日志介绍:是mysql数据库服务日志文件的一种,默认没有启用。记录除查询之外的sql命令。
查询命令例如: select show desc 不记录日志的查询内容
写命令例如: insert update delete create drop
3.1.2 启用binlog日志
]#vim /etc/my.cnf
[mysqld]
server_id=51
log-bin 启用日志默认row
binlog-format="mixed"
:wq
]# systemctl restart mysqld
]# ls /var/lib/mysql/主机名-bin.000001
]# cat /var/lib/mysql/主机名-bin.index
3.1.3 查看binlog日志文件内容
]#mysqlbinlog /var/lib/mysql/mysql51-bin.000001
****可以自定义binlog日志文件存储的位置和文件名称
]#mkdir /mylog
]#chown mysql /mylog
]#setenforce 0
]#vim /etc/my.cnf
[mysqld]
server_id=51
#log-bin
log-bin=/mylog/plj 路径 名字 要创建文件
binlog-format="mixed"
:wq
]# systemctl restart mysqld
]#ls /mylog/plj.*
plj.000001 plj.index
mysqlbinlong plj. |grep -i insert
3.1.4 手动生成新的日志文件方法
*默认日志文件大于500M时自动创建新日志文件
]# systemctl restart mysqld
mysql> flush logs;
]# mysql -uroot -p密码 -e "flush logs" -e选项简单sql命令 "show databases"
]# mysqldump -uroot -p密码 --flush-logs 库名 > 目录/xx.sql
增加新的日志
使用一个新的日志文件 记录 新创建的webdb库的初始操作。
mysql> flush logs;
mysql> create database webdb; create table webdb.a(id int);
mysql> insert into webdb.a values(100);
mysql> insert into webdb.a values(101);
mysql> flush logs; 单独生成库日志命令
删除webdb库,使用 binlog日志文件恢复webdb库的数据。
mysql> drop database webdb;
3.1.7 使用binlog日志恢复数据
]#mysqlbinlog /mylog/plj.000008 | mysql -uroot -p654321
3.1.5 删除已有的binlog日志文件
mysql> purge master logs to "binlog文件名;
删除指定日志文件之前的日志文件
mysql> purge master logs to "plj.000005";
mysql> reset master ; 删除所有的日志文件重新生成第一个日志文件
mysql> show master status; 显示当前正在使用的binlog日志信息
]#mysqlbinlog 日志文件名;
3.1.6 binlog日志记录sql命令方式
记录方式有2种: 偏移量 、记录sql命令执行的时间
指定偏移量范围选项
--start-position=偏移量的值
--stop-position=偏移量的值
指定时间范围选项
--start-datetime="yyyy-mm-dd hh:mm:ss"
--stop-position="yyyy-mm-dd hh:mm:ss"
++++++++++++++++++++++++
读取日志文件指定范围内的sql命令恢复数据。
]# mysqlbinlog --start-position=293 --stop-position=1450 plj.000001 | mysql -uroot -
p654321
++++++++++++++++++++++++++++
]#mysqldump -uroot -p654321 --flush-logs db3.user3 > /root/user3.sql
mysql> insert into db3.user3 values("a","b","c");
mysql> insert into db3.user3 values("aa","b","c");
mysql> insert into db3.user3 values("ab","b","c");
mysql> insert into db3.user3 values("ac","b","c");
mysql> delete from db3.users;
mysql> select * from db3.user3;
]#mysql -uroot -p654321 db3 < /root/user3.sql
mysql> select * from db3.user3;
]#mysqlbinlog --start-position=偏移量的值
--stop-position=偏移量的值 日志文件名 | mysql -uroot -p654321
mysql> select * from db3.user3;
+++++++++++++++++++++++++++++++++
3.2 安装第3方软件提供备份命令,对数据做增量备份
软件介绍 Percona 开源软件 在线热备不锁表 适用于生成环境。
婆堪呢
安装软件
]# rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm
]# yum -y install perl-DBD-mysql perl-Digest-MD5
]# rpm -ivh percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm
]# rpm -ql percona-xtrabackup-24
提供2个备份命令man innobackupexqsys
/usr/bin/innobackupex命令集成了命令xtrabackup,所以可以支持MYISAM存储引擎
/usr/bin/xtrabackup命令仅支持InnoDB和XtraDB存储引擎的表
innobackupex备份命令的使用格式?
]#innobackupex <选项>
]# man innobackupex
mysql 用户密码
performance_schema视图
sys 系统
常用选项?
--user 用户名
--password 密码
--databases="库名"
"库名1 库名2"
"库名.表名"
--no-timestamp 不使用时间戳做备份文件的子目录名
+++++++++++++++innobackupex完全备份 与 完全恢复
]# innobackupex --user root --password 654321 \
--databases="mysql performance_schema sys gamedb" /allbak --no-timestamp
++++++++++++++完全恢复
--copy-back
]# rm -rf /var/lib/mysql
]# mkdir /var/lib/mysql
]# innobackupex --user root --password 654321 --copy-back /allbak
]# chown -R mysql:mysql /var/lib/mysql
]# systemctl restart mysqld
]#mysql -uroot -p654321
mysql> show databases;
mysql> select * from gmaedb.t1;
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
事务日志文件cat xtrabackup_checkpoints
LSN 日志序列号
ibdata1
xtrabackup_logfile
innobackupex --user root --password 123456--databases=" mysql performance_schema sys db" --apply-log /allbak --no-timestamp
--apply-log 回滚日志
--copy-back拷贝
清空目录
chown -R mysql:mysql /var/lib/mysql
重起
增量备份的工作过程?
每一个备份目录下,都有记录当前目录备份信息的配置文件
]# cat 备份目录名/xtrabackup_checkpoints (记录备份类型 和lsn范围)
+++++++++innobackupex增量备份与恢复
--incremental 目录名 #增量备份
--incremental-basedir=目录名 #增量备份时,指定上一次备份文件存储的目录名
innobackupex --user root --password 123456 --databases=" mysql performance_schema sys " --incremental /new1dir --incremental-basedir=/allbak --no-timestamp
先要有一次完全备份 存放目录 /fullbak
]# innobackupex --user root --password 654321 \
--databases="gamedb mysql performance_schema sys" \
/fullbak --no-timestamp
插入新记录,执行增量备份 存放目录 /new1bak
mysql> insert into gamedb.t1 values(8080),(8080);
]# innobackupex --user root --password 654321 \
--databases="gamedb mysql performance_schema sys" \
--incremental /new1dir --incremental-basedir=/fullbak --no-timestamp
插入新记录,执行增量备份 存放目录 /new2bak
]# innobackupex --user root --password
--databases="mysql performance_schema sys"
--incremental /new2dir --incremental-basedir=/new1dir --no-timestamp
++++++++++++++增量恢复
--apply-log 准备恢复数据
--redo-only 合并日志
--incremental-dir=目录名 #增量恢复数据时,指定备份目录名称
--copy-back 恢复数据
清空数据库目录
]# rm -rf /var/lib/mysql
]# mkdir /var/lib/mysql
准备恢复数据
]# innobackupex --user root --password
--databases= "mysql performance_schema sys"
--apply-log /fullbak
合并日志
]# innobackupex --user root --password 654321 \
--databases="gamedb mysql performance_schema sys" \
--apply-log --redo-only /fullbak --incremental-dir=/new1dir
]# innobackupex --user root --password 654321 \
--databases="gamedb mysql performance_schema sys" \
--apply-log --redo-only /fullbak --incremental-dir=/new2dir
拷贝备份文件到数据库目录
]# innobackupex --user root --password 654321 \
--databases="gamedb mysql performance_schema sys" \
--copy-back /fullbak
]# ls /var/lib/mysql -l
修改文件的所有者/组mysql
]# chown -R mysql:mysql /var/lib/mysql
重启数据库服务
]# systemctl restart mysqld
]# mysql -uroot -p654321
+++++++++++++++++++++使用完全备份文件恢复单个表
--export 导出表信息
mysql> alter table 库.表 discard tablespace; 删除表空间
mysql> alter table 库.表 import tablespace; 导入表空间
1完全备份
]# innobackupex --user root --password 654321 \
--databases="studb" /allbakstudb --no-timestamp
2查看备份目录文件列表
system 在数据库打命令
]# ls /allbakstudb
]# ls /allbakstudb/studb
3误删除a表: mysql> drop table studb.a;
4 使用完全备份文件恢复单个表
4.1 按照备份时的表结构创建删除的表
create table studb.a(name char(10));
4.2 删除创建表的表空间文件
mysql> alter table studb.a discard tablespace;
4.3 使用备份文件导出表信息
]#innobackupex --user root --password 654321 \
--databases="studb" --apply-log --export /allbakstudb
4.4 把导出的表信息文件,拷贝到对应的数据库目录下,并修改所有者和组为mysql
]# cp /allbakstudb/studb/a.{cfg,exp,ibd} /var/lib/mysql/studb/
]# chown mysql:mysql /var/lib/mysql/studb/a.*
4.5 导入表空间
mysql> alter table studb.a import tablespace;
[root@mysql51 ~]# rm -rf /var/lib/mysql/studb/a.cfg
[root@mysql51 ~]# rm -rf /var/lib/mysql/studb/a.exp
4.6 查看记录
mysql> select * from studb.a;
2.3 配置mysql主从同步
启用binlog日志 做用户授权 show master status;
指定server_id 指定主数据库服务器的信息 启动slave进程
公共配置ping通
2.3.1 配置主库 (192.168.4.51)master slave
show master status;
a 做用户授权
grant replication slave on *.* to yaya@"%" identified by "123456";
b 启用binlog日志
vim /etc/my.cnf
[mysqld]
server_id=51
log-bin=master51
binlog-format="mixed"
:wq
]# systemctl restart mysqld
]# ls /var/lib/mysql/master51.*
/var/lib/mysql/master51.000001 /var/lib/mysql/master51.index
c 查看正在使用binlog日志信息
]#mysql -uroot -p123456
mysql> show master status;
2.3.2 配置从库
a 验证主库的用户授权
]# mysql -h192.168.4.51 -urepluser -p123456
mysql> show grants;
mysql> quit;
b 指定server_id
]# vim /etc/my.cnf
[mysqld]
server_id=52
:wq
]# systemctl restart mysqld
c数据库管理员本机登录,指定主数据库服务器的信息
]#mysql -uroot -p123456
change master to
master_host="192.168.4.62",
master_user="abc",
master_password="123456",
master_log_file="master62.000001",
master_log_pos=154;
d 启动slave进程
mysql> start slave;
e查看进程状态信息
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
stop slave
host62-relay-bin.*
host62-relay-bin.index
master.info
relay-log.info
show processlist;进程列表
2.4 在客户端测试主从同步配置
2.4.1 在主库服务器上添加访问数据时,使用连接用户
]# mysql -uroot -p123456
mysql> grant all on bbsdb.* to webadmin@"%" identified by "123456";
mysql>select user,host from mysql.user where user="webadmin";
mysql> quit;
2.4.2 客户端使用主库的授权用户,连接主库服务器,建库表插入记录
254]# mysql -h192.168.4.51 -uwebadmin -p123456
mysql> 建库 建表 插入记录
2.4.3 在从库本机,使用管理登录查看是否有和主库一样库表记录及授权用户
52]# mysql -uroot -p123456
mysql> select * from 库.表;
2.4.4 客户端使用主库的授权用户,连接从库服务器,也可以看到新建的库表及记录
254]# mysql -h192.168.4.52 -uwebadmin -p123456
mysql> select * from 库.表;
+++++++++++配置mysql主从从结构
主库 192.168.4.51
从库 192.168.4.52 ( 做51主机从库)
从库 192.168.4.53 ( 做53主机从库)
要求:客户端访问主库51 时 创建库表记录 在52 和53 数据库服务器都可以看到
配置步骤:
一、环境准备
主从同步未配置之前,要保证从库上要有主库上的数据。
禁用selinux ]# setenforce 0
关闭防火墙服务]# systemctl stop firewalld
物理连接正常 ]# ping -c 2 192.168.4.51/52
数据库正常运行,管理可以从本机登录
二、配置主从同步
2.1 配置主库51
2.1.1 用户授权
]#mysql -uroot -p123456
mysql> grant replication slave on *.* to yaya@"%" identified by "123456";
2.1.2 启用binlog日志
vim /etc/my.cnf
server_id=51
log-bin=db51
binlog-format="mixed"
:wq
]# systemctl restart mysqld
[root@db51 ~]# ls /var/lib/mysql/db51.*
/var/lib/mysql/db51.000001 /var/lib/mysql/db51.index
2.1.3 查看正在使用的日志信息
]#mysql -uroot -p123456
mysql> show master status;
+-------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------+----------+--------------+------------------+-------------------+
| db51.000001 | 154 | | | |
+-------------+----------+--------------+------------------+-------------------+
2.2 配置从库52
用户授权
]#mysql -uroot -p123456
mysql> grant replication slave on *.* to yaya@"%" identified by "123456";
启用binlog日志,指定server_id 和 允许级联复制
]# vim /etc/my.cnf
[mysqld]
server_id=52
log-bin=db52
binlog-format="mixed"
log_slave_updates
:wq
]# systemctl restart mysqld
[root@db52 ~]# ls /var/lib/mysql/db52.*
查看正在使用的日志信息
]#mysql -uroot -p123456
mysql> show master status;
+-------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------+----------+--------------+------------------+-------------------+
| db52.000001 | 154 | | | | |
+-------------+----------+--------------+------------------+-------------------+
binlog_do_db=name
binlog_ignore_db=name
log_slave_updates
relay_log=dbsvr2-relay-bin
replicate_do_db=mysql
replicate_ignore_db=test
验证主库的授权用户
]# mysql -h192.168.4.51 -uyaya -p123456
mysql> quit;
管理员登录指定主库信息
~]# mysql -uroot -p123456
change master to
master_host="192.168.4.62",
master_user="yaya",
master_password="123456",
master_log_file="master62.000006",
master_log_pos=154;
启动slave进程
mysql> start slave;
查看进程状态信息
mysql> show slave status \G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
2.3 配置从库53
2.3.1验证主库的授权用户
]#mysql -h192.168.4.52 -uuser53 -p654321
mysql> quit;
2.3.2 指定server_id
]# vim /etc/my.cnf
[mysqld]
server_id=53
:wq
]# systemctl restart mysqld
2.3.3 管理员登录指定主库信息
change master to
master_host="192.168.4.63",
master_user="yaya",
master_password="123456",
master_log_file="db63.000001",
master_log_pos=154;
2.3.4 启动slave进程
mysql> start slave;
2.3.5 查看进程状态信息
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
三、客户端验证配置
3.1 在主库上授权访问gamedb库的用户
mysql> grant all on gamedb.* to dada@"%" identified by "123456";
3.2 客户端使用授权用户连接主库,建库、表、插入记录
]# mysql -h192.168.4.51 -udada -p123456
create database gamedb;
create table gamedb.t1(id int);
insert into gamedb.t1 values(8888);
create table gamedb.t2(id int);
insert into gamedb.t2 values(99999);
select * from gamedb.t1;select * from gamedb.t2;
3.3 客户端使用授权用户连接2台从库时,也可以看到主库上新的库表记录
]# mysql -h192.168.4.52 -udada -p123456
select * from gamedb.t1;select * from gamedb.t2;
]# mysql -h192.168.4.53 -udada -p123456
select * from gamedb.t1;select * from gamedb.t2;
show variables like "have_dynamic_loading";
show variables like "rpl_semi_sync_ %_enabled";
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1
plugin-load = "rpl_semi_sync_master=semisync_master.so;
rpl_semi_sync_slave=semisync_slave.so“
rpl-semi-sync-master-enabled = 1
rpl-semi-sync-slave-enabled = 1