1、使用mysqldump命令备份
mysqldump命令将数据库中的数据备份成一个文本文件。表的结构和表中的数据将存储在生成的文本文件中。
mysqldump命令的工作原理很简单。它先查出需要备份的表的结构,再在文本文件中生成一个CREATE语句。然后,将表中的所有记录转换成一条INSERT语句。然后通过这些语句,就能够创建表并插入数据。
1)备份一个数据库
mysqldump基本语法:
mysqldump -u username -p dbname table1 table2 …-> BackupName.sql
其中:
dbname参数表示数据库的名称;
table1和table2参数表示需要备份的表的名称,为空则整个数据库备份;
BackupName.sql参数表设计备份文件的名称,文件名前面可以加上一个绝对路径。通常将数据库被分成一个后缀名为sql的文件;
通常的话,都是对整个数据库进行备份,不过mysqldump命令也支持备份哪几个表的用法。
举例:
当前我虚拟机上的一个mysql数据库test,就一张表,两条数据,我先把它备份起来,然后手工删除掉,再使用备份文件进行恢复。
[root@localhost ~]# mysqldump -uroot -p123456 test > /u01/hbk_bak.sql
执行上述命令之后,会在/u01/下生成hbk_bak.sql文件,文件内容如下:
-- MySQL dump 10.13 Distrib 5.6.33, for linux-glibc2.5 (x86_64)
--
-- Host: localhost Database: test
-- ------------------------------------------------------
-- Server version 5.6.33
/*!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 */;
--
-- Table structure for table `hbk`
--
DROP TABLE IF EXISTS `hbk`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `hbk` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `hbk`
--
LOCK TABLES `hbk` WRITE;
/*!40000 ALTER TABLE `hbk` DISABLE KEYS */;
INSERT INTO `hbk` VALUES (1,'huangbaokang'),(2,'zhanglulu');
/*!40000 ALTER TABLE `hbk` 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 2018-12-07 9:07:10
删除掉注释,其实就下面几条语句,也很好理解。
DROP TABLE IF EXISTS `hbk`;
CREATE TABLE `hbk` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
LOCK TABLES `hbk` WRITE;
INSERT INTO `hbk` VALUES (1,'huangbaokang'),(2,'zhanglulu');
UNLOCK TABLES;
知识点补充:
文件中以“–”开头的都是SQL语言的注释,以"/!40101"等形式开头的是与MySQL有关的注释。40101是MySQL数据库的版本号,如果MySQL的版本比1.11高,则/!40101和*/之间的内容就被当做SQL命令来执行,如果比4.1.1低就会被当做注释。
2)备份多个数据库
加上–databases参数即可
举例,从上面的截图可以知道我mysql数据库中有一个db_springcloud的库,以下语句将备份test和db_springcloud两个数据库。
[root@localhost ~]# mysqldump -uroot -p --databases test db_springcloud > /u01/hbk_morebak.sql
Enter password:
3)备份所有数据库
加上–all-databases即可,等价于备份整个mysql数据库。
[root@localhost ~]# mysqldump -uroot -p --all-databases > /u01/hbk_all.sql
2、直接复制整个数据库目录
这种方式其实是最简单的,但是需要停库,在开发库上是可以这样操作的,但是在生产库上,一般很难申请停库做文件拷贝,因为如果没有停库,拷贝数据文件的时候会用新的写入导致数据不一致。
3、使用mysqlhotcopy工具快速备份
一看名字就知道是热备份。因此,mysqlhotcopy支持不停止MySQL服务器备份。而且,mysqlhotcopy的备份方式比mysqldump快。mysqlhotcopy是一个perl脚本,主要在Linux系统下使用。其使用LOCK TABLES、FLUSH TABLES和cp来进行快速备份。
原理:先将需要备份的数据库加上一个读锁,然后用FLUSH TABLES将内存中的数据写回到硬盘上的数据库,最后,把需要备份的数据库文件复制到目标目录。
目前这个工具仅支持备份MyISAM类型的表,并且mysqlhotcopy并非mysql自带,需要安装Perl的数据库接口包;下载地址为:http://dev.mysql.com/downloads/dbi.html,所以在这里不多作介绍。
数据还原(恢复)
语法,使用mysqldump备份的sql文件进行恢复,只是箭头的方向反一下<(导入,还原) >(导出,备份)
举例:
手工删除test数据库的hbk表
[root@localhost ~]# mysql -uroot -p test < /u01/hbk_bak.sql
刷新mysql数据库客户端,发现已成功恢复,一切恢复正常。