MySQL8 / PostgreSQL13 如何导入外部SQL文件?
本文介绍在 MySQL 8 和 PostgreSQL 13 中导入外部 SQL 文件的几种常用方法,包括包含建表语句和插入数据的 SQL 文件。
0x01 前置准备
在导入 SQL 文件之前,需要确保:
- MySQL 8 服务已启动
- 已创建目标数据库(如果 SQL 文件中不包含创建数据库的语句)
- 拥有数据库的操作权限
-- 登录 MySQL
mysql -u root -p
-- 创建目标数据库(如果需要)
CREATE DATABASE IF NOT EXISTS mydb;
USE mydb;
0x02 使用 source 命令导入
source 是 MySQL 客户端内置的命令,适合导入中小型的 SQL 文件。
基本语法
SOURCE /path/to/yourfile.sql;
示例
-- 在 MySQL 客户端中执行
SOURCE /home/user/data/init.sql;
-- Windows 路径示例(注意双反斜杠)
SOURCE C:\\Users\\admin\\data\\init.sql;
注意事项
- 文件路径可以是绝对路径或相对路径(相对于 MySQL 客户端启动目录)
- 如果 SQL 文件包含
USE database_name;语句,可以省略先前的USE命令 - 大文件导入可能耗时较长,耐心等待直到出现
Query OK提示
0x03 使用 mysql 命令行导入
在操作系统命令行直接执行,适合批量导入或脚本自动化。
基本语法
mysql -u username -p database_name < /path/to/sqlfile.sql
参数说明
| 参数 | 说明 |
|---|---|
-u |
指定用户名 |
-p |
提示输入密码 |
database_name |
目标数据库名 |
< |
输入重定向符号 |
示例
# 导入到指定数据库
mysql -u root -p mydb < init.sql
# 如果 SQL 文件包含创建数据库语句
mysql -u root -p < full_backup.sql
# 指定字符集(解决中文乱码问题)
mysql -u root -p --default-character-set=utf8mb4 mydb < init.sql
0x04 导入包含建表和数据的 SQL 文件
下面是一个完整的示例 SQL 文件,包含了建表语句和插入数据:
-- init_database.sql
-- 创建数据库
CREATE DATABASE IF NOT EXISTS shop CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE shop;
-- 创建用户表
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL,
password_hash VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 创建商品表
CREATE TABLE IF NOT EXISTS products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
description TEXT,
price DECIMAL(10, 2) NOT NULL,
stock INT DEFAULT 0,
category_id INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 插入用户数据
INSERT INTO users (username, email, password_hash) VALUES
('admin', 'admin@example.com', '$2b$10$abcdefghijklmnopqrstuv'),
('user1', 'user1@example.com', '$2b$10$zyxwvutsrqponmlkjihgf'),
('user2', 'user2@example.com', '$2b$10$ABCDEFGHIJKLMNOPQRSTU');
-- 插入商品数据
INSERT INTO products (name, description, price, stock, category_id) VALUES
('笔记本电脑', '15.6英寸轻薄本', 5999.00, 50, 1),
('无线鼠标', '蓝牙5.0无线鼠标', 89.00, 200, 2),
('机械键盘', '青轴机械键盘', 299.00, 80, 2);
导入示例
# 方法一:使用 mysql 命令行
mysql -u root -p shop < init_database.sql
# 方法二:在 MySQL 客户端内
mysql> SOURCE /path/to/init_database.sql;
# 方法三:指定字符集(推荐)
mysql -u root -p --default-character-set=utf8mb4 shop < init_database.sql
0x05 导入大文件的注意事项
使用命令行导入
对于超过几十 MB 的大文件,建议使用操作系统命令行:
# 启用详细输出,查看导入进度
mysql -u root -p -v mydb < large_file.sql
# 或使用 pv 监控进度
pv large_file.sql | mysql -u root -p mydb
调整 MySQL 配置
如果导入大文件时遇到问题,可以调整以下配置:
-- 查看当前配置
SHOW VARIABLES LIKE 'max_allowed_packet';
SHOW VARIABLES LIKE 'net_buffer_length';
-- 临时增加允许的包大小(单位:字节)
SET GLOBAL max_allowed_packet = 268435456; -- 256MB
-- 增加网络缓冲区
SET GLOBAL net_buffer_length = 1048576; -- 1MB
注意事项
- 修改配置后需要重新连接数据库才能生效
- 生产环境修改配置前请评估影响
0x06 验证导入结果
导入完成后,可以验证数据是否正确导入:
-- 查看所有表
SHOW TABLES;
-- 查看表结构
DESC users;
DESC products;
-- 查看数据
SELECT * FROM users;
SELECT * FROM products;
-- 统计行数
SELECT COUNT(*) FROM users;
SELECT COUNT(*) FROM products;
0x07 常见问题处理
中文乱码
如果导入后出现中文乱码,检查以下几点:
- 确保 SQL 文件编码为 UTF-8
- 创建数据库时指定正确的字符集
- 导入时指定字符集
-- 创建数据库时指定字符集
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 导入时指定字符集
mysql -u root -p --default-character-set=utf8mb4 mydb < init.sql
导入中断
如果导入过程中断,可能的原因:
- SQL 语法错误
- 外键约束失败
- 唯一键冲突
解决方法:
-- 暂时禁用外键检查
SET FOREIGN_KEY_CHECKS = 0;
-- 执行导入...
-- 重新启用外键检查
SET FOREIGN_KEY_CHECKS = 1;
权限问题
如果遇到权限错误:
-- 授予用户权限
GRANT ALL PRIVILEGES ON mydb.* TO 'username'@'localhost';
FLUSH PRIVILEGES;
参考
- MySQL 8.0 Reference Manual - Database Administration
- MySQL 8.0 - mysql Client
- MySQL 8.0 - SHOW TABLES
PostgreSQL 13 导入外部SQL文件
本节介绍在 PostgreSQL 13 中导入外部 SQL 文件的常用方法。
0x01 前置准备
在导入 SQL 文件之前,需要确保:
- PostgreSQL 13 服务已启动
- 已创建目标数据库(如果 SQL 文件中不包含创建数据库的语句)
- 拥有数据库的操作权限
# 登录 PostgreSQL
psql -U postgres
# 创建目标数据库(如果需要)
CREATE DATABASE mydb;
0x02 使用 psql 命令行导入
psql 是 PostgreSQL 客户端的命令行工具,适合导入各种大小的 SQL 文件。
基本语法
psql -U username -d database_name -f /path/to/yourfile.sql
参数说明
| 参数 | 说明 |
|---|---|
-U |
指定用户名 |
-d |
目标数据库名 |
-f |
指定要执行的 SQL 文件 |
-h |
主机地址(默认 localhost) |
-p |
端口(默认 5432) |
示例
# 导入到指定数据库
psql -U postgres -d mydb -f init.sql
# 指定主机和端口
psql -U postgres -h localhost -p 5432 -d mydb -f init.sql
# 如果 SQL 文件包含创建数据库语句
psql -U postgres -f full_backup.sql
# 静默模式(不输出执行信息)
psql -U postgres -d mydb -f init.sql -q
0x03 使用 psql 交互式导入
在 psql 客户端内执行 \i 命令。
基本语法
\i /path/to/yourfile.sql
示例
# 进入 psql 客户端
psql -U postgres -d mydb
-- 在 psql 内执行
mdb=> \i /home/user/data/init.sql
-- Windows 路径示例
mdb=> \i C:\Users\admin\data\init.sql
注意事项
- 文件路径可以是绝对路径或相对路径
- 如果 SQL 文件包含连接其他数据库的语句,确保目标数据库存在
0x04 导入包含建表和数据的 SQL 文件
下面是一个完整的示例 SQL 文件,包含了创建表和插入数据:
-- init_database.sql
-- 创建扩展(如果需要)
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- 创建用户表
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL,
password_hash VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 创建商品表
CREATE TABLE IF NOT EXISTS products (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
description TEXT,
price DECIMAL(10, 2) NOT NULL,
stock INT DEFAULT 0,
category_id INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 插入用户数据
INSERT INTO users (username, email, password_hash) VALUES
('admin', 'admin@example.com', '$2b$10$abcdefghijklmnopqrstuv'),
('user1', 'user1@example.com', '$2b$10$zyxwvutsrqponmlkjihgf'),
('user2', 'user2@example.com', '$2b$10$ABCDEFGHIJKLMNOPQRSTU');
-- 插入商品数据
INSERT INTO products (name, description, price, stock, category_id) VALUES
('笔记本电脑', '15.6英寸轻薄本', 5999.00, 50, 1),
('无线鼠标', '蓝牙5.0无线鼠标', 89.00, 200, 2),
('机械键盘', '青轴机械键盘', 299.00, 80, 2);
导入示例
# 方法一:使用 psql 命令行
psql -U postgres -d shop -f init_database.sql
# 方法二:在 psql 客户端内
psql -U postgres -d shop
shop=> \i /path/to/init_database.sql
0x05 导入大文件的注意事项
使用 psql 导入
对于大文件,建议使用 psql 命令行:
# 启用详细输出
psql -U postgres -d mydb -f large_file.sql -v ON_ERROR_STOP=1
# 使用 pv 监控进度
pv large_file.sql | psql -U postgres -d mydb
调整 PostgreSQL 配置
如果导入大文件时遇到问题,可以调整以下配置:
-- 查看当前配置
SHOW max_connections;
SHOW shared_buffers;
SHOW work_mem;
-- 临时增加工作内存
SET work_mem = '256MB';
注意事项
- PostgreSQL 默认单条 SQL 语句大小限制较小
- 大文件建议分批次导入或使用
pg_dump/pg_restore
0x06 验证导入结果
导入完成后,可以验证数据是否正确导入:
-- 查看所有表
\dt
-- 查看表结构
\d users
\d products
-- 查看数据
SELECT * FROM users;
SELECT * FROM products;
-- 统计行数
SELECT COUNT(*) FROM users;
SELECT COUNT(*) FROM products;
0x07 常见问题处理
中文乱码
如果导入后出现中文乱码,检查以下几点:
- 确保 SQL 文件编码为 UTF-8
- 创建数据库时指定正确的编码
# 创建数据库时指定编码
psql -U postgres
postgres=> CREATE DATABASE mydb WITH ENCODING 'UTF8';
导入中断
如果导入过程中断,可能的原因:
- SQL 语法错误
- 外键约束失败
- 唯一键冲突
解决方法:
-- 暂时禁用外键约束
SET CONSTRAINTS ALL DEFERRED;
-- 执行导入...
-- 重新启用外键约束(如果有问题会自动报错)
权限问题
如果遇到权限错误:
-- 授予用户权限
GRANT ALL PRIVILEGES ON DATABASE mydb TO username;
-- 授予表权限
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO username;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO username;
参考
目录