MySQL_备份与迁移,导入与导出

数据备份是管理数据库非常重要的工作,系统意外崩溃或硬件损坏都可能造成数据的丢失,所以应该定期备份数据库,意外发生时可使用备份还原数据库,尽量减少损失。

数据备份

mysqldump命令

mysqldump命令执行时,将数据库备份成一个文本文件,该文件中包含了很多个create和insert语句,使用这些语句可以重新创建表和插入数据

mysqldump -u user -h host -p dbname [tbname...]>filename.sql

-- user 用户名
-- host 登录主机
-- dbname 数据库名
-- tbname 表名
-- > 指定备份文件
-- filename 备份文件名

备份一个数据库中所有表

mysqldump -h localhost -u root -p scm>d:/scm_backup.sql

回车后输入密码便对数据进行了备份,备份文件示例

-- MySQL dump 10.13  Distrib 5.7.28, for Win64 (x86_64)
--
-- Host: localhost    Database: scm
-- ------------------------------------------------------
-- Server version	5.7.28-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 */;

--
-- Table structure for table `category`
--

DROP TABLE IF EXISTS `category`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `category` (
  `CategoryID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` varchar(20) COLLATE utf8_bin NOT NULL,
  `Remark` varchar(200) COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`CategoryID`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `category`
--

LOCK TABLES `category` WRITE;
/*!40000 ALTER TABLE `category` DISABLE KEYS */;
INSERT INTO `category` VALUES (1,'水果',''),(2,'饮料','甜甜的'),(3,'儿童图书',''),(4,'糖果',''),(7,'粮油','甜甜的'),(9,'家居用品','甜甜的');
/*!40000 ALTER TABLE `category` ENABLE KEYS */;
UNLOCK TABLES;

--

文件开头首先表明了使用工具的版本号,备份账户信息,主机信息,备份数据库名称和MySQL服务器版本号。

备份文件接下来的部分是set语句,这些语句将一些系统变量值赋给用户定义变量,确保恢复的数据库变量与备份时变量相同。

备份文件中以“–” 开头的为注释语句,以“/* !”和“*/”结尾的语句为可执行的MySQL注释,这些语句会被MySQL执行,但在其他数据库管理系统中会被作为注释,提高数据库的移植性。

另外一些语句以数字开头,代表了MySQL的版本号限制,这些语句只有在指定的MySQL版本或更高版本中才能执行。

备份一个数据库中某个表

mysqldump -h localhost -u root -p scm category>d:/scm_category_backup.sql

备份多个数据库

mysqldump -h localhost -u root -p --databases dbname[ dbname ...]>filename.sql

备份所有数据库

mysqldump -h localhost -u root -p --all-databases>filename.sql

直接复制数据库目录进行备份

因为MySQL表保存为文件形式,所以可以直接复制数据库的存储目录和文件进行备份。MySQL的存储目录位置不一定相同,Windows下一般安装目录中的data目录,Linux下通常是/var/lib/mysql,需查找确认。

这是一种简单,快速,有效地备份方式,要想保持备份的一致性,需要对相关表进行lock tables操作,然后对表进行flush tables 。这样复制数据库目录中的文件时,允许其他客户继续查询表。flush tables语句确保开始备份前将所有激活的索引页写入硬盘。也可以停止MySQL服务后再进行备份。

这种方法虽然简单,但不是最好的,因为这种方法对InnoDB引擎的表格不适用,使用这种方法备份的数据最好还原到相同版本的服务器中,否则可能不兼容。

使用mysqlhotcopy工具快速备份

mysqlhotcopy是一个Perl脚本,使用lock tables,flush tables,cp或scp来快速备份数据库。它是备份数据库或单个表的最快途径,但它只能运行在数据库目录所在的机器上,并且只能备份MyISAM类型的表。在Linux中运行:

mysqlhotcopy db_name1,...db_namen path/to/new_directory

要执行mysqlhotcopy必须可以访问要备份的表文件,具有查询表的select权限。

数据还原

使用MySQL命令

对于已经备份的包含create和insert语句的文本文件,可以通过MySQL命令导入到数据库中。

mysql -u user -p [db_name]<filename.sql

如果备份文件时通过Mysqldump创建的包含创建数据库语句的文件,执行的时候不需要指定数据库名称。

如果已经登陆MySQL服务器,还可以使用source命令导入SQL文件

source filename

执行source前,必须使用use语句选择数据库

直接复制到数据库目录

如果数据库通过复制数据库文件实现备份,可以直接复制备份文件到MySQL数据目录下实现还原。通过这种还原方式,必须保持备份的数据库和还原的数据库主版本号一致,而且这种方式对MyISAM有效,对InnoDB无效。

mysqlhotcopy快速恢复

将备份的数据库文件复制到MySQL存放数据的位置,重启服务。如果root用户执行操作,必须指定数据库文件的所有者

cp -R /user/backup/test /user/local/mysql/data

如果要恢复的数据库已经存在,需要使用drop删除之后再恢复。

数据库迁移

数据库迁移就是把数据从一个系统移动到另一个系统上,数据迁移的原因:

  • 需要安装新版本的数据库服务器
  • MySQL版本更新
  • 数据库管理系统变更

相同版本MySQL数据库之间的迁移

最常用和最安全的方式是使用Mysqldump命令导出数据,在目标数据库服务器中年通过MySQL命令导入

mysqldump -h host1 -u root -p password dbname|mysql -h host2 -u root -p password dbname

导出的数据可以直接通过管道符“|”传入MySQL命令。

不同版本MySQL数据库之间迁移

新版本对旧版本有一定的兼容性。从旧版本向新版本迁移时,对于MyISAM的表可以直接复制数据文件,也可以使用Mysqldump和mysqlhotcopy。对于InnoDB的表,一般只能通过Mysqldump导出再使用MySQL命令导入到目标服务器上。从新版本向旧版本迁移要小心,最好Mysqldump。

不同数据库之间迁移

迁移之前,需要了解不同数据库的架构,比较它们的差异。因为数据库厂商不会按照标准SQL设计数据库,导致不同数据库中的SQL语句差异,迁移时需要对这些语句进行映射处理。

可使用工具完成数据库迁移,如使用myodbc实现MySQL和SQL server 之间的迁移。

表的导出

有事需要将MySQL数据库中的数据导出到外部存储文件中,MySQL数据库中的数据可以导出成SQL文件,xml文件,HTML文件,同样这些文件也可以导入到MySQL数据库中

MySQL允许使用具有导出定义的select语句进行数据的导出操作,该文件被创建在服务器主机上,必须拥有文件写入的权限,才能使用此语法,可以将被选择的数据写入文件

select ... into outfile filename [options]
select * from emp where sal>2000 into outfile 'd:/emp_backup.txt'

使用Mysqldump命令

mysqldump -h localhost -u root -p scm>d:/scm_backup.sql

使用MySQL命令导出文件

mysql -u root -p -execute="select ..." dbname>filename

表的导入

MySQL提供了一些导入数据的工具,包括load data,source和MySQL命令

load data infile "filename" into table table_name [options]
mysqlimport -u root -p dbname filename [options]

遇到问题:secure-file-priv
解决方法:查询show variables like '%secure%'查看参数,在my.cnf的mysqd中添加secure-file-priv=… ,之后重启MySQL服务。

发布了360 篇原创文章 · 获赞 26 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Chill_Lyn/article/details/104194784