数据库备份
Posted joylofty
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库备份相关的知识,希望对你有一定的参考价值。
数据库备份,恢复实操
策略一:(文件系统备份工具 cp )(适合小型数据库,是最可靠的) 1 、停止 mysql 服务器。 2 、直接复制整个数据库目录。注意:使用这种方法最好还原到相同版本服务器中,不同版本可能不兼容。 3 、目标服务器上还原。 4 、目标服务器数据库目录授权,重启服务器测试
策略二:mysqldump 备份数据库(完全备份 + 增加备份,速度相对较慢,适合中小型数据库) ( MyISAM 是温备份, InnoDB 是热备份) 示例一:备份恢复单个数据库备份: mydqldump - u 用户 –p’ 密码 ’ –default - character - set = Iatin1 数据库名 [ | gzip ] > 备份文件名 恢复: 1 ) MySQL 中用 source 命令 2 ) mysql 命令恢复 示例二:备份恢复单个表 备份:mysqldump - u 用户名 - p 数据库名 表名 > 备份的文件名 备份多个表:mysqldump - u 用户名 - p 数据库名 表名 1 表名 2 > 备份的文件名 示例三:备份数据结构 - d 只备份库结构,不包含数据内容 示例四:增量备份 前提: 1 ) my .cnf ,是要开启 MySQL log - bin 日志功能,重启 MySQL log_bin = /data/mysql/data/mysql - bin 2 )存在一个完全备份,生产环境一般凌晨某个时刻进行全备 InnoDB 表在备份时,通常启用选项 -- single - transaction 来保证备份的一致性
策略三: mydumper 备份数据库mydumper 输出文件 metadata: 元数据 记录备份开始和结束时间,以及 binlog 日志文件位置。 table data : 每个表一个文件 table schemas : 表结构文件 binary logs : 启用 -- binlogs 选项后,二进制文件存放在 binlog_snapshot 目录下 daemon mode : 在这个模式下,有五个目录 0 , 1 , binlogs , binlog_snapshot , last_dump 。 备份目录是 0 和 1 ,间隔备份,如果 mydumper 因某种原因失败而仍然有一个好的快照, 当快照完成后, last_dump 指向该备份。 Mydumper 备份示例 [ root @localhost ~ ] # mydumper -h localhost -u root -p 888 -t 6 -S /tmp/mysql.sock -B school -o /mysqlbackup/ [ root @tianyun ~ ] # ls /mysqlbackup/ binlog_snapshot school .student1.sql school .student4 - schema .sql school .t2_old - schema .sql ... [ root @localhost ~ ] # cat /mysqlbackup/metadata Started dump at : 2015 - 09 - 15 10 : 12 : 54 SHOW MASTER STATUS : Log: tianyun - bin .000003 Pos: 2089998 Finished dump at : 2015 - 09 - 15 10 : 12 : 54 Mydumper 恢复示例 [ root @localhost ~ ] # myloader -h localhost -u root -p 888 -S /tmp/mysql.sock -d /mysqlbackup/ -o -B school# 1.编译安装 [root@localhost ~]# yum -y install glib2-devel mysql-devel zlib-devel pcre-devel zlib gcc-c++ gcc cmake [root@localhost ~]# wget https://launchpad.net/mydumper/0.9/0.9.1/+download/mydumper-0.9.1.tar.gz [root@localhost ~]# tar zxf mydumper-0.9.1.tar.gz [root@localhost ~]# cd mydumper-0.9.1/ [root@localhost mydumper-0.9.1]# cmake . [root@localhost mydumper-0.9.1]# make [root@localhost mydumper-0.9.1]# make install # 安装完成后生成两个二进制文件 mydumper 和 myloader 位于 /usr/local/bin 目录下 [root@localhost bin]# ls /usr/local/bin/ mydumper myloader
策略四: lvm 快照从物理角度实现几乎热备的完全备份,配合二进制日志备份实现增量备份,速度快适 合比较烦忙的数据库 前提: 数据文件要在逻辑卷上; 此逻辑卷所在卷组必须有足够空间使用快照卷; 数据文件和事务日志要在同一个逻辑卷上; 操作流程 1 )锁表 flush table with read lock 2 )查看 position 号并记录,便于后期恢复 show master status 3 )创建 snapshot 快照 create snapshop 4 )解表 unlock tables 5 )挂载 snapshot 6 )拷贝 snapshot 数据,进行备份。备份整个数据库之前,要关闭 mysql 服务(保护 ibdata1 文件) 7 )卸载 8 )移除快照
一、数据库备份,数据库为school,素材如下
[root@localhost ~]# mysql -uroot -p123456
mysql> create database school;
mysql> use school;
1.创建student和score表
CREATE TABLE student (
id INT(10) NOT NULL UNIQUE PRIMARY KEY ,
name VARCHAR(20) NOT NULL ,
sex VARCHAR(4) ,
birth YEAR,
department VARCHAR(20) ,
address VARCHAR(50)
);
二、MySQL主从复制
MySQL集群高可用架构,MySQL主从架构,此种架构,一般初创企业比较常用,也便于后面步步的扩展
2.1创建score表。SQL代码如下:
CREATE TABLE score (
id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT ,
stu_id INT(10) NOT NULL ,
c_name VARCHAR(20) ,
grade INT(10)
);
2.2为student表和score表增加记录
如果无法插入中文可以去下面这篇博客
(12条消息) MySQL插中文报错“ERROR 1366 (HY000): Incorrect string value: ‘\\xE7\\xAC...”修改MySQL字符集,数据库字符集,表的字符集,表中字段的字符集_[err] 1366 - incorrect string value: '\\xe7\\xa9\\xba_未注销233的博客-CSDN博客
向student表插入记录的INSERT语句如下:
INSERT INTO student VALUES( 901,'张老大', '男',1985,'计算机系', '北京市海淀区');
INSERT INTO student VALUES( 902,'张老二', '男',1986,'中文系', '北京市昌平区');
INSERT INTO student VALUES( 903,'张三', '女',1990,'中文系', '湖南省永州市');
INSERT INTO student VALUES( 904,'李四', '男',1990,'英语系', '辽宁省阜新市');
INSERT INTO student VALUES( 905,'王五', '女',1991,'英语系', '福建省厦门市');
INSERT INTO student VALUES( 906,'王六', '男',1988,'计算机系', '湖南省衡阳市');
向score表插入记录的INSERT语句如下:
INSERT INTO score VALUES(NULL,901, '计算机',98);
INSERT INTO score VALUES(NULL,901, '英语', 80);
INSERT INTO score VALUES(NULL,902, '计算机',65);
INSERT INTO score VALUES(NULL,902, '中文',88);
INSERT INTO score VALUES(NULL,903, '中文',95);
INSERT INTO score VALUES(NULL,904, '计算机',70);
INSERT INTO score VALUES(NULL,904, '英语',92);
INSERT INTO score VALUES(NULL,905, '英语',94);
INSERT INTO score VALUES(NULL,906, '计算机',90);
INSERT INTO score VALUES(NULL,906, '英语',85);
3.备份数据库school到/backup目录
[root@localhost ~]# mkdir -p /backup/mysql
# 备份数据库
[root@localhost ~]# mysqldump -uroot -p123456 student > /backup/mysql/t1.sql
# 加上-B参数,备份数据库时创建数据库和切换数据库
[root@localhost ~]# mysqldump -uroot -p123456 -B student > /backup/mysql/t1_2.sql
# 备份时,压缩备份文件
[root@localhost ~]# mysqldump -uroot -p123456 -B student | gzip > /backup/mysql/t1_3.sql.gz
4.备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库
mysqldump --add-drop-table -uroot -p123456 school > t2.sql
5.直接将MySQL数据库压缩备份
[root@localhost ~]# mysqldump -uroot -p123456 -B school | gzip > /backup/mysql/t3.sql.gz
6.备份MySQL数据库某个(些)表。此例备份student表
[root@localhost ~]# mysqldump -uroot -p123456 school student >/backup/mysql/t4.sql
7.同时备份多个MySQL数据库(其他数据库素材自行准备)
[root@localhost ~]# mysqldump -uroot -p123456 -B study school > /backup/mysql/t5.sql
8.仅仅备份数据库结构
mysqldump --no-data -uroot -p123456 --databases student > /backup/mysql/t6.sql
9.备份服务器上所有数据库
mysqldump -uroot -p123456 -A >/backup/mysql/all.sql
10.还原MySQL数据库
直接导入会报错,在 mysql 执行 reset master命令,退出后再执行还原命令即可
mysql> reset master;
[root@localhost ~]# mysql -uroot -p123456 -B student < /home/mysql/t1_2.sql
如果前面使用cp备份的,可以使用cp回去
cp -a /var/lib/mysql/* /backup #保留权限的拷贝源数据文件
cp -a /backup/* /var/lib/mysql/
11.还原压缩的MySQL数据库
# 方法一:直接恢复
[root@localhost mysql]# zcat t1_3.sql.gz | mysql -uroot -p123456
# 方法二:解压后在 mysql 命令行恢复
[root@localhost mysql]# gzip -d t1_3.sql.gz
mysql> source /home/mysql/t1_3.sql
12.使用xtrabackup 备份数据库
innobackupex开源,xtrabackup商业化
使用经典命令会产生时间戳数据库。
[root@localhost ~]# innobackupex --user=root --password=123456 --socket=tmp/mysql.sock /backup/mysql/
[root@localhost ~]# innobackupex --user=root --password=123456 --socket=tmp/mysql.sock --no-timestamps /backup/mysql/full_'data+%F'
13.在另外的数据库服务器上还原xtrabackup 备份
[root@localhost ~]# ll /backup/mysql/2023-03-28_20-41-39/
backup-my.cnf#备份用到的配置选项信息文件
ibdata1#数据文件
xtrabackup_binlog_info #mysql服务器当前正在使用的二进制日志文件和此时二进制日志时间的位置信息文件
xtrabackup_checkpoints #备份的类型、状态和LSN状态信息文件
xtrabackup_info #详细信息
xtrabackup_logfile #备份的日志文件
备份应用
[root@localhost 2023-03-28_20-41-39]# innobackupex --apply-log /backup/mysql/2023-03-28_20-41-39/
停止数据库[root@localhost 2023-03-28_20-41-39]# systemctl stop mysqld
还原数据库到默认目录
[root@localhost 2023-03-28_20-41-39]# innobackupex --copy-back /backup/mysql/2023-03-28_20-41-39/
修改数据文件属主属组
[root@localhost 2023-03-28_20-41-39]# chown -R mysql.mysql /usr/local/mysql/data/
启动数据库
[root@localhost 2023-03-28_20-41-39]# systemctl start mysql
14.使用mydumper备份数据库
# mydumper工具备份
[root@localhost ~]# mydumper -u root -p 123456 -B student -o /mysql_back
# mydumper工具备份,同时压缩
[root@localhost ~]# mydumper -u root -p 123456 -B student -c -o /mysql_back
# 备份表
[root@localhost ~]# mydumper -u root -p 123456 -B student -T student,course -o /backup/tables
15.使用mydumper恢复数据库
# 恢复文件
localhost-mysql
[root@localhost ~]# myloader -u root -p 123456 -B student -o -d /mysql_back/
# 恢复表
[root@localhost ~]# myloader -u root -p 123456 -d /backup/tables/ -o -B student
mydumper 参数
myloader 参数
mysql数据库备份与恢复
数据库备份方式
热备份:不影响业务的正常读写
温备份:对表加锁,只允许对数据库进行读操作
冷备份:业务暂停
物理备份:备份mysql相关的数据文件
逻辑备份:将数据从mysql中导出来,一般是一个sql文件(无索引数据)
全备份:完全备份
增量备份:针对上一次备份进行叠加
差异备份:针对上一次完全备份,选择差异进行备份
使用mysqldump备份
逻辑备份、单进程(速度慢)、锁表(一般在从库进行备份);
可以使用mysqldumper工具,进行多进程备份。
备份实例:
# mysqldump --flush-logs cacti plugin_thold_contacts plugin_thold_log plugin_thold_template_contact plugin_thold_threshold_contact thold_data thold_template >cacti_thold.sql //cacti库多表备份
# mysqldump -h rds.amazonaws.com -u root -p production_sts pubkey_change_logs --where="created<‘2016-05-04‘" > pubkey_change_logs_0312to0503.sql //指定备份部分内容(归档时使用)
# mysqldump -u root -p -d --databases treasure treasure_admin treasure_logs treasure_sts >duobao.sql //多库备份,及只备份表结构,不备份数据-d
# mysqldump -u root -pxxxx -B ehr --single-transaction --master-data=2 --routines |/usr/bin/bzip2 > /data1/mysql_backup/ehr-db01/ehr_inc.sql.bz //线上使用的大库备份
恢复方法:
mysql命令直接导入、source命令、load命令
使用xtrabackup进行增量备份
热备份、物理备份,安装及介绍:https://www.percona.com/doc/percona-server/LATEST/index.html
安装后含有xtrabackup和innobackup两个工具,此处使用用后者;
需要扫描mysql相关数据文件、配置文件,不支持远程备份(如:云数据库实例)。
备份实例:
# innobackupex --user=root -pxxxxx /data/backup/innodbbackup/ //最简单的完全备份
# innobackupex --user=root -pxxxxx --incremental --incremental_basedir=/data/backup/innodbbackup/2018-02-07_17-08-31/ /data/backup/innodbbackup/ //增量备份,需要指定上次的备份位置(lsn信息)
# innobackupex -u root -pxxxxx --no-timestamp --extra-lsndir=/data1/innobackup/0207/lsn_17/ --stream=tar /data1/innobackup/ |gzip > /data1/innobackup/0207-1737.tgz //打包压缩
# innobackupex --user=root -pxxxxx /data/backup/innodbbackup/ --stream=tar |gzip|sshpass -p "sshpass" ssh -p 18122 [email protected] "cat - > /data1/xtrabackup/zabbix/0207_1737.tgz" //备份并发送到远程服务器
数据恢复:
1.服务器准备:安装同版本mysql,初始化后,关闭mysql服务,清空mysql的数据目录
2.获取备份:也可以直接在备份的时候远程保存
3.恢复命令:
# tar -i -xf 0207_1737.tgz //如果打包了,先解包
日志文件恢复(完全备份):完成事务、同步数据等操作,使数据文件达到一致性
# innobackupex --defaults-file=/usr/local/mysql/my.cnf --apply-log --redo-only --u root -pxxxx /tmp/mysql/fullbackup
增量日志文件恢复(如果是多个增量,按顺序依次恢复),需要指定lsn
# innobackupex --defaults-file=/usr/local/mysql/my.cnf --apply-log --redo-only -u root -pxxxxx /tmp/mysql/incre-1337 --incremental-dir=/tmp/mysql/incre/1337
# innobackupex --defaults-file=/usr/local/mysql/my.cnf --apply-log -u root -pxxxx /tmp/mysql/2016-04-26_13-48-39 //最后一次将增量和完全备份合并,将未提交的事物回滚,但不需要--redo-only参数。
数据恢复:要保证原来的数据目录为空(如果有其他库,先移动在其他目录,后期移回来即可)
# innobackupex --defaults-file=/usr/local/mysql/my.cnf --copy-back -u root -pxxxxx /tmp/mysql/2016-04-26_13-48-39
- 最后重新对mysql_data目录授权,并启动mysql服务即可。
线上使用增量备份脚本
#!/bin/bash
hour=`date +%H`
day=`date +%F`
now=`date +%F_%H`
passwd="mysqlpass"
function backup()
{
case $1 in
full)
/usr/bin/innobackupex -u root -p${passwd} --no-timestamp --extra-lsndir=/data1/innobackup/${day}/lsn_${now}/ --stream=tar /data1/innobackup/${day}/ |gzip > /data1/innobackup/${day}/${now}.tgz
;;
incre)
if [ -d /data1/innobackup/${day}/lsn_${last}/xtrabackup_checkpoints ];then
/usr/bin/innobackupex -u root -p${passwd} --no-timestamp --incremental --incremental_basedir=/data1/innobackup/${day}/lsn_${last}/ --extra-lsndir=/data1/innobackup/${day}/lsn_${now}/ --stream=tar /data1/innobackup/${day} |gzip > /data1/innobackup/${day}/${now}.tgz
else
echo "incremental_basedir not found,do a full backup"
/usr/bin/innobackupex -u root -p${passwd} --no-timestamp --extra-lsndir=/data1/innobackup/${day}/lsn_${now}/ --stream=tar /data1/innobackup/${day}/ |gzip > /data1/innobackup/${day}/${now}.tgz
fi
;;
*)
echo "nothing todo"
;;
esac
}
case $hour in
01)
last=`date +%F -d -yesterday`
find /data1/innobackup/ -name "${last}*" -type d -exec rm -r "{}" \;
backup full
;;
10)
last=`date +%F_%H -d -9hours`
backup incre
;;
14|18|22)
last=`date +%F_%H -d -4hours`
backup incre
;;
*)
echo "not backup time"
esac
以上是关于数据库备份的主要内容,如果未能解决你的问题,请参考以下文章
怎样备份/还原MySQL数据库 之 MySQL Workbench