系列文章目录
前言
当数据库部署在他人的系统上时,例如阿里云,腾讯云等,但是无法登录账号,直接使用阿里云的批量导出,数据库量太大,一个一个的通过navicat的导出不现实,因此就需要一种手段来,批量的导出sql文件,因此我才书写了此篇文章。
一、Python导出
序
因为java操作数据库网上的参考文档较少,因此,此处采用了python来进行sql文件的导出。
Python
import pymysql
import subprocess
import os
# MySQL RDS连接信息
# RDS_HOST 是你的RDS实例的域名或IP地址
RDS_HOST = 'IP'
RDS_PORT = 3306 # RDS实例的端口,默认是3306
RDS_USER = 'root' # RDS的用户名
RDS_PASS = 'root' # RDS的密码,这里使用了特殊字符,确保在命令行中不会造成解析问题
# 本地保存SQL文件的目录
LOCAL_DIR = 'D:/sql/' # 指定一个本地目录来保存导出的SQL文件
# 确保本地目录存在
# 如果目录不存在,则创建它
if not os.path.exists(LOCAL_DIR):
os.makedirs(LOCAL_DIR)
# 连接到MySQL RDS实例
# 使用pymysql库连接到RDS实例
connection = pymysql.connect(host=RDS_HOST,
port=RDS_PORT,
user=RDS_USER,
password=RDS_PASS,
charset='utf8mb4', # 使用utf8mb4字符集支持全字符集
cursorclass=pymysql.cursors.DictCursor) # 使用字典游标以便更容易地处理查询结果
try:
with connection.cursor() as cursor:
# 获取所有数据库名称
# 使用SQL命令SHOW DATABASES;获取所有数据库名
sql = "SHOW DATABASES;"
cursor.execute(sql)
# 过滤掉系统数据库,只获取用户创建的数据库名
databases = [db['Database'] for db in cursor.fetchall() if
db['Database'] not in ['information_schema', 'mysql', 'performance_schema', 'sys']]
# 遍历所有数据库并导出到本地
# 遍历每一个数据库
for db_name in databases:
# 构造SQL文件路径
sql_file = LOCAL_DIR + db_name + ".sql"
# 构造mysqldump命令
# mysqldump是MySQL的一个命令行工具,用于导出数据库
mysqldump_cmd = f"mysqldump --set-gtid-purged=off --column-statistics=0 -h {RDS_HOST} -P {RDS_PORT} -u {RDS_USER} --password={RDS_PASS} --databases {db_name} > {sql_file}"
try:
# 使用subprocess模块运行mysqldump命令
# shell=True允许在shell中执行命令,check=True表示如果命令返回非零退出码则抛出异常
subprocess.run(mysqldump_cmd, shell=True, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print("数据库名:", db_name) # 打印成功导出的数据库名
except subprocess.CalledProcessError as e:
# 如果mysqldump命令执行失败,捕获异常并打印错误信息
print("错误信息:", e.stderr.decode()) # 注意:这里需要decode()来将bytes转换为str
finally:
# 无论是否发生异常,都确保连接被关闭
connection.close()
注意事项
1.数据库的名称不能为中文名,一旦为中文名,在编译mysqldump命令的时候,会出现乱码的情况,并且报错,导致无法正常导出
2.上面的mysqldump部分的命令为mysql5.7的命令,如果使用的数据库版本为8.0,并且运行上面的命令报错,还请自行百度,8.0的命令是什么,从而进行修改 mysqldump_cmd 属性值
3.因为这个不仅仅是导出了数据库的表结构,还导出了数据,因此可能导出的速度会偏慢,如果出现输出了正确的命令的,但是卡住的情况,还请耐心等待,此时数据库正在进行sql文件的导出
4.如果是从文件管理器里,直接复制路径的话,他默认采用的是反斜线,会自动转义,导致实际路径与访问路径不符,因此一定要手动替换斜线
二、sql合并
序
如果使用navicat进行导入的话,多个文件的导入效率依旧缓慢,因此需要把所有的sql文件进行统一的合并成一个文件,然后进行导入。
windows操作
此时我们需要使用到windows的文件合并命令
具体的命令为
cd D:\sql
type *.sql >allMysql.sql
因为我是在对应的路径下进行的操作,因此需要先进入对应的路径下,然后使用type命令进行文件的合并
可以看到他在不断地合并文件,直到所有的文件都合并完成,即可在navicat下运行已经合并好的文件,等到导入完成后即可使用
注意事项
中文不要参与合并,最好单独导入,否则容易出各种字节码类型的问题
Navicat导入
如果文件太大会出现报错
[ERR] 2006 - Server has gone away
此时需要调整限传大小,运行下面的命令,重新运行sql即可
set global max_allowed_packet = 1024*1024*1024
在导入文件的时候一定要勾选掉在每个运行中运行多个查询,否则很容易报错