在命令行下导出数据库是数据库管理中的常见操作,适用于备份、数据迁移或开发环境搭建等场景,不同数据库系统的命令行工具和语法存在差异,以下分别以MySQL、PostgreSQL和SQLite为例,详细说明导出方法及注意事项。
MySQL数据库导出
MySQL使用mysqldump
工具进行导出,该工具是MySQL官方提供的逻辑备份工具,支持导出表结构、数据或整个数据库。
基本语法
mysqldump -u [用户名] -p [数据库名] > [导出文件路径].sql
-u
:指定数据库用户名(如root
)。-p
:表示需要输入密码(执行命令后会提示输入,密码不可见,安全)。[数据库名]
:要导出的数据库名称(如test_db
)。>
:将输出重定向到指定文件(默认导出为SQL脚本)。
常用参数及说明
参数 | 作用 | 示例 |
---|---|---|
-P |
指定数据库端口(默认3306) | -P 3307 |
-h |
指定数据库主机地址(默认localhost ) |
-h 192.168.1.100 |
--single-transaction |
对于InnoDB引擎,在单个事务中导出,避免锁表(推荐生产环境使用) | --single-transaction |
--databases |
导出多个数据库(数据库名用空格分隔) | --databases db1 db2 |
--all-databases |
导出所有数据库 | --all-databases |
--no-data |
仅导出表结构,不导出数据 | --no-data |
--default-character-set |
指定字符集(避免乱码,常用utf8mb4 ) |
--default-character-set=utf8mb4 |
示例
- 导出单个数据库(包含数据和结构):
mysqldump -u root -p test_db > /backup/test_db.sql
- 导出多个数据库(
db1
和db2
):mysqldump -u root -p --databases db1 db2 > /backup/multi_db.sql
- 仅导出表结构:
mysqldump -u root -p --no-data test_db > /backup/test_db_structure.sql
PostgreSQL数据库导出
PostgreSQL使用pg_dump
工具进行导出,支持灵活的导出格式(如SQL脚本、自定义归档格式等)。
基本语法
pg_dump -U [用户名] -d [数据库名] -f [导出文件路径].sql
-U
:指定数据库用户名(如postgres
)。-d
:指定数据库名称(如test_db
)。-f
:指定导出文件路径(若不指定,默认输出到终端)。
常用参数及说明
参数 | 作用 | 示例 |
---|---|---|
-h |
指定数据库主机地址(默认localhost ) |
-h 192.168.1.100 |
-p |
指定数据库端口(默认5432) | -p 5433 |
-W |
强制提示输入密码(若未设置.pgpass 文件,推荐使用) |
-W |
--schema-only |
仅导出表结构,不导出数据 | --schema-only |
--data-only |
仅导出数据,不导出表结构 | --data-only |
-t |
导出指定表(可多次使用,支持通配符) | -t table1 -t table2 |
-F |
指定导出格式(p 为纯SQL,c 为自定义归档,d 为目录格式) |
-F c -f backup.dump |
示例
- 导出单个数据库为SQL脚本:
pg_dump -U postgres -d test_db -f /backup/test_db.sql
- 仅导出
users
表:pg_dump -U postgres -d test_db -t users -f /backup/users.sql
- 导出为自定义归档格式(可用于
pg_restore
恢复):pg_dump -U postgres -d test_db -F c -f /backup/test_db.dump
SQLite数据库导出
SQLite是轻量级文件数据库,导出通过sqlite3
命令行工具的内置命令.dump
完成。
基本语法
sqlite3 [数据库文件路径] ".dump" > [导出文件路径].sql
[数据库文件路径]
:SQLite数据库文件(如test.db
)。.dump
:SQLite内置命令,用于导出数据库结构和数据(默认导出所有表)。
常用场景示例
- 导出整个数据库:
sqlite3 /data/test.db ".dump" > /backup/test_db.sql
- 仅导出指定表(如
users
表):sqlite3 /data/test.db ".dump users" > /backup/users.sql
- 导出前可先进入交互模式(手动执行命令):
sqlite3 /data/test.db sqlite> .output /backup/test_db.sql -- 指定输出文件 sqlite> .dump -- 执行导出 sqlite> .exit -- 退出
注意事项
- 权限问题:执行导出命令的用户需具备数据库的
SELECT
权限(MySQL)或CONNECT
、TEMPORARY
权限(PostgreSQL),SQLite需对数据库文件有读取权限。 - 文件路径:导出路径需有写入权限,建议使用绝对路径(如
/backup/
)避免路径错误。 - 大数据库处理:对于大型数据库,可结合压缩工具(如
gzip
)减少文件体积,例如MySQL导出时直接压缩:mysqldump -u root -p test_db | gzip > /backup/test_db.sql.gz
- 字符集一致性:导出时需确保字符集与数据库一致(如MySQL的
utf8mb4
),避免恢复时乱码。
相关问答FAQs
Q1:导出时提示“Access denied”怎么办?
A1:该错误通常由权限不足导致,需检查:① 用户名和密码是否正确;② 用户是否有导出权限(MySQL中需SELECT
、LOCK TABLES
权限,PostgreSQL需CONNECT
、TEMPORARY
权限);③ 主机地址是否允许连接(MySQL需检查user
表的host
字段,PostgreSQL需检查pg_hba.conf
文件),可通过GRANT
命令授权(如MySQL:GRANT SELECT, LOCK TABLES ON *.* TO 'user'@'localhost';
)。
Q2:如何导出特定表而不是整个数据库?
A2:不同数据库支持指定表导出:
- MySQL:在数据库名后添加表名(多个表用空格分隔),
mysqldump -u root -p test_db table1 table2 > /backup/tables.sql
- PostgreSQL:使用
-t
参数(可多次使用),pg_dump -U postgres -d test_db -t table1 -t table2 -f /backup/tables.sql
- SQLite:在
.dump
后指定表名,sqlite3 test.db ".dump table1" > /backup/table1.sql
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/13987.html