在生产环境中,数据的安全性是至关重要的,任何数据的丢失都有可能产生严重的后果,十几块备份的重要性主要体现在:
(1):提高系统的高可用性和灾难可恢复性,在数据库系统崩溃时,没有数据库备份就没有办法找到数据。
(2)使用数据库备份还原数据库,是数据库崩溃时提供数据恢复最小代价的最优方案,如果让用户重新添加数据,代价未免太大了。
(3)没有时间就没有一切,数据库备份是一种防范灾难的强力手段。
在使用数据库的过程中,有多种原因造成数据丢失,(1)程序错误 (2)人为错误 (3)计算机失败 (4)磁盘失败 (5)灾难
备份方式有很多种,从物理与逻辑的角度,备份分为以下几类:
(1)物理备份;指对数据操作系统的物理文件(如数据文件,日志文件等)的备份。物理备份又可以分为脱机备份(冷备份)和联机备份(热备份)。
冷备份:在关闭数据库状态中进行操作,能够较好地保证数据库的完整性。
热备份:在数据库运行状态中进行操作,这种备份方法依赖于数据库的日志文件。
(2)逻辑备份:值对数据库逻辑组件(如表等数据库对象)的备份。
从数据库的备份策略角度,备份分为完全备份和差异备份和增量备份。
(1)完全备份:每次对数据进行完整地备份,可以备份整个数据库,包括用户表、系统表、索引、视图和存储过程等所有数据库对象,但它需要花费更多的时间和空间,所以,做一次完全备份的周期要长些,优点是备份与恢复操作简单方便,缺点是数据存在大量的重复,占用大量的备份空间,备份时间长。
(2)差异备份:备份那些自从上次完全备份之后被修改过的文件,只备份数据库部分的内容,它比最初的完全备份小、因为只包含自上次完全备份以来所改变的数据库,它的优点是存储和恢复速度快。
(3)增量备份:只有那些在上次完全备份或者增量备份后被修改的文件才会被备份。
Mysql数据库的备份可以采用两种方式,因为数据库实际上就是文件,直接打包数据库文件夹,或者是使用专门的备份工具mysqldump都可以进行备份工作。
(1)使用tar打包文件夹备份
Mysql的数据库文件默认都是保存在安装目录的data文件夹下面,可以直接保存data文件夹,但是占用空间较大,可以使用tar打包压缩进行保存。
(1.1安装xz压缩格式工具)
[root@kgc1 ~]# yum install -y xz
(1.2)对数据库文件夹/usr/src/data(自定义的安装路径下的data文件) 进行打包操作
[root@kgc1 ~]# tar Jcvf /opt/mysql-$(date +%F).tar.xz /data/
使用ls命令查看是否运行成功
[root@kgc1 ~]# ls /opt/
mysql-2020-06-27.tar.xz mysql-.tar.xz rh
(1.3)对比打包前后的文件大小,可以看到压缩的备份文件占用空间很小。
[root@kgc1 ~]# du -sh /opt/mysql-2020-06-27.tar.xz
37M /opt/mysql-2020-06-27.tar.xz
[root@kgc1 ~]# du -sh /data/
385M /data/
(1.4)如果数据库文件损坏数据丢失,可以解压备份文件,相当于做了数据恢复的工作。
[root@kgc1 ~]# tar Jxvf /opt/mysql-2020-06-27.tar.xz data/
(2)使用mysqldump工具备份 //备份db1这个库
[root@kgc1 opt]# mysqldump -uroot -p -B db1 > /opt/mysql3.sql
(3)使用cat mysql3.sql查看备份信息.
[root@kgc1 opt]# cat mysql3.sql
-- MySQL dump 10.13 Distrib 5.7.30, for linux-glibc2.12 (x86_64)
--
-- Host: localhost Database: db1
-- ------------------------------------------------------
-- Server version 5.7.30-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Current Database: `db1`
--
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db1` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `db1`;
--
-- Table structure for table `idtest`
--
DROP TABLE IF EXISTS `idtest`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `idtest` (
`id` int(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `idtest`
--
LOCK TABLES `idtest` WRITE;
/*!40000 ALTER TABLE `idtest` DISABLE KEYS */;
/*!40000 ALTER TABLE `idtest` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2020-06-28 10:20:40
(4)不登录mysql数据库使用mysql命令恢复库idtest,命令格式如下:
[root@kgc1 opt]# mysql -uroot -p </opt/mysql3.sql
扩展备份参数:
(1)使用mysqldump命令对某些表进行完全备份,命令如下;
Mysqldump -u用户名 -p密码 【选项】【数据库名】【数据表名】> /备份文件位置/备份文件名字
如:mysqldumo -uroot -p123456 imployee——salary(库名) IT_salary IT_desc >/opt/salary.sql
(2):使用命令mysldump命令对单个库进行完全备份:
Mysqldump -u用户名 -p密码 【选项】 【数据库名】 > /备份文件位置/备份文件名字/
注意:没有加参数-B的mysqldump备份恢复是需要手动创建库名或表名
(3)使用myslqdump 命令对多个库进行完全备份命令格式:
Mysqldump -u用户名 -p密码 【选项】--databases 数据库名1 空格 数据库名2 > /备份文件位置/备份文件名字/
(4)使用mysqldump命令对所有库进行完全备份,命如下:
Mysqldump -u用户名 -p密码 -B --all-databases > /备份文件位置/备份文件名字/
如:
mysqldump -uroot -p -B --all-databases > /opt/mysql4.sql
(5)使用mysqldump命令也可以直接备份表结构,命令如下;
Mysqldump -u用户名 -p密码 -B -d 数据库名 表名 > /备份文件位置/备份文件名字/
(1)使用source命令整库恢复
Source备份脚本路径
mysql> source /opt/mysql4.sql;
(2)mysql命令整库恢复,命令格式:
Mysql -uroot(用户名) -p(密码) < /opt/mysql4.sql(库备份的路径)
如下:
[root@kgc1 opt]# mysql -uroot -p Enter password:
1.5使用shenll脚本实现自动化备份
[root@kgc1 mysqlbak]# vim mysqlbak.sh
#!/bin/bash
#mysqlbak
id="root"
pwd="123456"
dbname="--all-databases"
mysqlbak="/opt/mysqlbak"
db="mysqldump"
[ ! -d $mysqlbak ] && mkdir -p $mysqlbak
cd $mysqlbak
mysqlbakdate=mysql_$(date +%Y-%m-%d)
"$db" -u"$id" -p"$pwd" -B "$dbname" > /opt/mysqlbak/"$mysqlbakdate".sql
if [ $? -eq 0 ]
then
echo "mysql数据库备份成功"
else
echo "mysql数据库备份未成功请尽快处理" | mail -s "mysql数据库备份异常" **********@qq.com
Fi
把脚本添加到计划任务中//每天的23点59分备份数据库
[root@kgc1 ~]# crontab -e
59 23 * * * /mysqlbak/mysqlbak.sh
使用crontab -l查看计划任务
[root@kgc1 ~]# crontab -l
59 23 * * * /mysqlbak/mysqlbak.sh