使用SELECT INTO OUTFILE备份数据,但这不会备份表的结构,所以只能导入相同结构的表。
具体语法:
SELECT [...] INTO { OUTFILE | DUMPFILE } '文件名' FROM 表名;
先用LOCK TABLES命令锁定写,避免数据冲突
LOCK TABLES 表名 WRITE;
导出数据
SELECT * INTO OUTFILE 文件名 FROM 表名;
备份完后使用UNLOCK TABLES命令解锁表。
也可以用mysqldump程序操作,可以:
- 备份指定数据库或其中指定表:
mysqldump [OPTIONS] 数据库名 [表名] > 文件名 - 备份多个数据库:
mysqldump [OPTIONS] --databases [OPTIONS] 数据库1 [数据库2 数据库3 ...] > 文件名 - 备份所有数据库:
mysqldump [OPTIONS] --all-databases [OPTIONS] > 文件名
这里的[OPTION]有很多选项,这里列出其中一小部分:
--add-locks:生成的SQL语句中,在每个表数据恢复之前增加LOCK TABLES并且之后UNLOCK TABLE。(为了使得更快地插入到MySQL)。--add-drop-table:生成的SQL语句中,在每个create语句之前增加一个drop table。-e/--extended-insert:使用全新多行INSERT语法。(给出更紧缩并且更快的插入语句)-l/--lock-tables:为开始导出数据前,读锁定所有涉及的表。-q/--quick:不缓冲查询,直接倾倒至stdout。--opt:选项,它会使上述所有选项有效。
默认为--opt
「例」使用mysqldump备份所有数据库:
mysqldump -u root -proot --all-databases > test.sql
-u后面是用户名,-p后面跟着密码。
使用LOAD DATA INFILE恢复数据,先对表的写入加锁:
LOCK TABLES 表名 WRITE;
然后导入数据
LOAD DATA INFILE 文件名 REPLACE INTO TABLE 表名;
如果不想锁表,可以使用LOW_PRIORITY,数据的导入将推迟到没有用户读表之后进行:
LOAD DATA LOW_PRIORITY INFILE 文件名 REPLACE INTO TABLE 表名;
也可以用mysqlimport恢复数据:
mysqlimport -u 用户名 -p密码 --replace 数据库名 文件名
如果不想锁表,就加上--low-priority
MySQL数据备份与恢复方法
7296

被折叠的 条评论
为什么被折叠?



