一、数据库导出(备份)用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
然后创建数据库、选数据库:
-- 创建数据库,字符集选utf8mb4CREATE 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文件有报错能直接看到在哪。
三、常见坑和注意事项
- 导入导出一定要注意字符集统一:数据库、表、连接字符集都用utf8mb4,不然导入之后中文乱码、emoji丢失是常有的事,别用utf8,utf8在MySQL里是假的,不支持4字节的emoji;
- 导出大文件不要用phpmyadmin:phpmyadmin是web端,PHP有执行时间限制、内存限制,几百M的文件很容易导入导出到一半超时,导了一半失败还容易搞坏数据,大文件直接用命令行最稳妥;
- 导入前最好把外键检查关了:如果数据库有外键约束,导入的时候可能因为表导入顺序不对报错,可以在sql文件最开头加这两行:
SET FOREIGN_KEY_CHECKS=0;-- 导入内容SET FOREIGN_KEY_CHECKS=1;
不过用mysqldump导出的文件默认已经加了,不用自己加; 4. 备份文件不要存在服务器同一块磁盘上:备份完最好下载到本地或者传到其他存储上,不然服务器磁盘坏了备份也没了。 我一般迁移网站数据库都是直接用mysqldump导出,scp传到新服务器,命令行导入,比面板快很多,哪怕几个G的数据库也不会出问题,非常稳。