1.1数据库备份的重要性
在生产环境中,数据的安全性是至关重要的,任何数据的丢失都有可能产生严重的后果,十几块备份的重要性主要体现在:
(1):提高系统的高可用性和灾难可恢复性,在数据库系统崩溃时,没有数据库备份就没有办法找到数据。
(2)使用数据库备份还原数据库,是数据库崩溃时提供数据恢复最小代价的最优方案,如果让用户重新添加数据,代价未免太大了。
(3)没有时间就没有一切,数据库备份是一种防范灾难的强力手段。
在使用数据库的过程中,有多种原因造成数据丢失,(1)程序错误 (2)人为错误 (3)计算机失败 (4)磁盘失败 (5)灾难
1.2数据库备份的分类。
备份方式有很多种,从物理与逻辑的角度,备份分为以下几类:
(1)物理备份;指对数据操作系统的物理文件(如数据文件,日志文件等)的备份。物理备份又可以分为脱机备份(冷备份)和联机备份(热备份)。
冷备份:在关闭数据库状态中进行操作,能够较好地保证数据库的完整性。
热备份:在数据库运行状态中进行操作,这种备份方法依赖于数据库的日志文件。
(2)逻辑备份:值对数据库逻辑组件(如表等数据库对象)的备份。
从数据库的备份策略角度,备份分为完全备份和差异备份和增量备份。
(1)完全备份:每次对数据进行完整地备份,可以备份整个数据库,包括用户表、系统表、索引、视图和存储过程等所有数据库对象,但它需要花费更多的时间和空间,所以,做一次完全备份的周期要长些,优点是备份与恢复操作简单方便,缺点是数据存在大量的重复,占用大量的备份空间,备份时间长。
(2)差异备份:备份那些自从上次完全备份之后被修改过的文件,只备份数据库部分的内容,它比最初的完全备份小、因为只包含自上次完全备份以来所改变的数据库,它的优点是存储和恢复速度快。
(3)增量备份:只有那些在上次完全备份或者增量备份后被修改的文件才会被备份。
1.3mysql自带备份工具mysqldump
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.xz37M /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.4 mysql完全恢复
(1)使用source命令整库恢复
Source备份脚本路径mysql> source /opt/mysql4.sql;
(2)mysql命令整库恢复,命令格式:
Mysql -uroot(用户名) -p(密码) < /opt/mysql4.sql(库备份的路径)
如下:
[root@kgc1 opt]# mysql -uroot -p </opt/mysql4.sql
Enter password:
1.5使用shenll脚本实现自动化备份
[root@kgc1 mysqlbak]# vim mysqlbak.sh#!/bin/bash#mysqlbakid=\"root\"pwd=\"123456\"dbname=\"--all-databases\"mysqlbak=\"/opt/mysqlbak\"db=\"mysqldump\"[ ! -d $mysqlbak ] && mkdir -p $mysqlbakcd $mysqlbakmysqlbakdate=mysql_$(date +%Y-%m-%d)\"$db\" -u\"$id\" -p\"$pwd\" -B \"$dbname\" > /opt/mysqlbak/\"$mysqlbakdate\".sqlif [ $? -eq 0 ]thenecho \"mysql数据库备份成功\"elseecho \"mysql数据库备份未成功请尽快处理\" | mail -s \"mysql数据库备份异常\" **********@qq.comFi
把脚本添加到计划任务中//每天的23点59分备份数据库
[root@kgc1 ~]# crontab -e59 23 * * * /mysqlbak/mysqlbak.sh
使用crontab -l查看计划任务
[root@kgc1 ~]# crontab -l59 23 * * * /mysqlbak/mysqlbak.sh