一、数据库导出(备份)用mysqldump

mysqldump是MySQL自带的备份工具,不用装额外软件,命令行就能用,最常用的导出命令:


1. 导出整个数据库到sql文件

mysqldump -u用户名 -p密码 数据库名 > 备份文件名.sql
# 例子
mysqldump -uroot -p123456 my_blog > my_blog_20261030.sql

注意-p和密码之间没有空格,不然会报错。执行之后会让你输密码,输完就会在当前目录生成备份sql文件。

2. 只导出表结构,不导出数据

如果只要建表语句,不要数据,加-d参数:

mysqldump -uroot -p -d 数据库名 > schema.sql

3. 只导出部分表

比如只导出数据库里的文章表和评论表:

mysqldump -uroot -p 数据库名 表名1 表名2 > tables_backup.sql

4. 导出大数据库的时候加这几个参数

几G的大数据库用默认参数导出可能会很慢,或者导入的时候有问题,加这几个参数更好:

mysqldump -uroot -p --single-transaction --default-character-set=utf8mb4 --skip-lock-tables 数据库名 > backup.sql

  • --single-transaction:对InnoDB表做一致性备份,不用锁表,导出的时候不影响数据库正常读写,这个非常重要,不然导出的时候会锁表网站就打不开了;
  • --default-character-set=utf8mb4:指定字符集utf8mb4,避免emoji表情乱码;
  • --skip-lock-tables:跳过锁表,适合MyISAM表,InnoDB用--single-transaction就够了。

二、数据库导入的两种方法

方法1:命令行直接导入,适合大文件

导入前先提前建好空数据库,然后执行:

mysql -u用户名 -p 数据库名 < 备份文件.sql
# 例子
mysql -uroot -p my_blog_new < my_blog_20261030.sql

输入密码之后就会开始导入,文件多大都能导,不会有phpmyadmin的上传大小限制、超时问题。 如果导入的时候出现中文乱码,加--default-character-set参数:

mysql -uroot -p --default-character-set=utf8mb4 my_blog_new < my_blog_20261030.sql

方法2:进入MySQL命令行用source导入

先登录MySQL:

mysql -uroot -p

然后创建数据库、选数据库:

-- 创建数据库,字符集选utf8mb4
CREATE DATABASE my_blog_new DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- 用这个数据库
USE my_blog_new;
-- 然后用source命令导入,写备份文件的绝对路径
source /root/backup/my_blog_20261030.sql;

执行之后就会开始导入,会显示每一步的执行结果,如果sql文件有报错能直接看到在哪。

三、常见坑和注意事项

  1. 导入导出一定要注意字符集统一:数据库、表、连接字符集都用utf8mb4,不然导入之后中文乱码、emoji丢失是常有的事,别用utf8,utf8在MySQL里是假的,不支持4字节的emoji;
  2. 导出大文件不要用phpmyadmin:phpmyadmin是web端,PHP有执行时间限制、内存限制,几百M的文件很容易导入导出到一半超时,导了一半失败还容易搞坏数据,大文件直接用命令行最稳妥;
  3. 导入前最好把外键检查关了:如果数据库有外键约束,导入的时候可能因为表导入顺序不对报错,可以在sql文件最开头加这两行:

SET FOREIGN_KEY_CHECKS=0;
-- 导入内容
SET FOREIGN_KEY_CHECKS=1;

不过用mysqldump导出的文件默认已经加了,不用自己加; 4. 备份文件不要存在服务器同一块磁盘上:备份完最好下载到本地或者传到其他存储上,不然服务器磁盘坏了备份也没了。 我一般迁移网站数据库都是直接用mysqldump导出,scp传到新服务器,命令行导入,比面板快很多,哪怕几个G的数据库也不会出问题,非常稳。