1. 概述
首先,数据库的备份理论上只是一句命令的事,但是也可以通过循环遍历数据库的表实现备份,但是无疑那样会使代码量提升很多,不过就是用SQL语句,原理倒是非常简单。当然,现在市面上用的最多的还是用命令的,这条命令如果手动操作应该是在命令窗口就可以实现的,用代码的话不过是拼接下字符串,生成命令,然后运行一下罢了
2. 数据库备份
def database_backup(request):
''' 定义变量 '''
databases = 'huayang_2th_mao' # 定义要备份的数据库名
sql_host = '192.168.110.200'
sql_user = 'root' # 数据库登陆用户
sql_pwd = '123456' # 数据库登陆密码
root_path = r'\database_backup\\' # 存放sql文件的地址
sql_port = '3306' # 存放sql文件的地址
''' 创建存放备份文件的文件夹 '''
mkdir_dir = root_path + time.strftime('%Y%m%d') + "/" # 在/home/work/目录下用当天时间的格式创建目录
if not os.path.exists(mkdir_dir): # 判断如果没有当天时间目录
os.mkdir(mkdir_dir) # 创建
print('创建文件夹成功:', os.path.abspath(mkdir_dir)) # 打印创建成功
# sys.setrecursionlimit(3000)
''' 开始备份到指定文件夹 '''
os.chdir(mkdir_dir)
# for database_name in databases: # 循环huayang_2th_mao数据库
today_sql = databases + '_' + time.strftime('%Y%m%d') + '.sql' # 定义数据库文件名变量
# 编写cmd语句
# sql_comm = "mysqldump -u%s -p%s %s > %s --default_character-set=utf8" % (
sql_comm ="mysqldump -u%s -h%s -p%s -P %s %s > %s --default_character-set=utf8" % (
sql_user, sql_host, sql_pwd, sql_port, databases, today_sql) # 定义备份数据库变量
if os.system(sql_comm) == 0: # 如果上一条执行结果等于0,表示成功
print(databases, 'is backup successfully!') # 打印成功信息
print('备份文件地址:', os.path.abspath('./') + today_sql)
else: # 备份失败
print(databases, 'is backup fail!') # 打印成功信息
return HttpResponse()
值得注意的是,这里的mysqldump命令是MySQL中自带的插件,也就是说你的电脑上要有mysql,然后还要在MySQL的bin下运行mysqldump命令才会有反应(如果你配置了MySQL全局变量,那么应该是任何地方mysqldump都是可以的)
例如(我配置了MySQL全局变量):
这里我就遇到了一个问题:MySQL安装在docker内部,但是django项目在docker外部,怎么使用docker内部MySQL的musqldump插件呢?
当时是有两种解决方案的:1、将docker内部MySQL挂载出来 2、将docker内部MySQL停止,在docker外再安装一个MySQL
结果:挂载太麻烦,整完了感觉没什么用,外面安装MySQL的话,由于服务器不是自己的,好多权限受限制,2种方案自己都没有行通。。。。。。。。。。。。。。。。。
巧合之下看到了下面这篇文章:
https://www.saoniuhuo.com/question/detail-2064035.html
其实他说的这种方法我之前有想过,毕竟我只要mysqldump能够使用,不需要MySQL数据库,完全可以只将与mysqldump相关的文件复制出来用啊
可是首先我不知道哪些文件与mysqldump相关,其次我将自己电脑上的mysqldump复制到服务器,系统不一样,无法用,这篇文章证实了我这种想法是对的
但是需要复制一份linux系统的mysqldump到项目下,mysqldump就可以用了
从docker容器内复制一份:
sudo docker cp mysql2:/usr/bin/mysqldump docker/mysql
mysql2:容器名
/usr/bin/mysqldump:容器内mysqldump位置
docker/mysql:docker外部存放位置
将复制出来的mysqldump放进项目根目录下就可以用了
3. 导入生成的.sql文件到test数据库
"""恢复数据库,前提该数据库存在"""
def database_restore(request):
''' 定义变量 '''
old_databases = 'huayang_2th_mao'
new_databases = 'test' # 定义要备份的数据库名
sql_host = '192.168.110.200'
sql_user = 'root' # 数据库登陆用户
sql_pwd = '123456' # 数据库登陆密码
root_path = r'\database_backup\\' # 存放sql文件的地址
mkdir_dir = root_path + time.strftime('%Y%m%d') + "/" # 在/home/work/目录下用当天时间的格式创建目录
print(mkdir_dir)
if os.path.exists(mkdir_dir):
print("文件夹存在")
os.chdir(mkdir_dir)
string_sql = old_databases + '_' + time.strftime('%Y%m%d') + '.sql'
sql_comm = "mysql -h%s -u%s -p%s %s < %s --force --default_character-set=utf8" % (
sql_host, sql_user, sql_pwd, new_databases, string_sql)
os.system(sql_comm)
print("导入成功")
else:
print("导入失败")
return HttpResponse()
mysqldump命令解析:
https://blog.csdn.net/Wyongkang/article/details/123558313?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168429678416800215047084%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168429678416800215047084&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-5-123558313-null-null.142v87control,239v2insert_chatgpt&utm_term=mysqldump%E5%91%BD%E4%BB%A4%E8%AF%A6%E8%A7%A3&spm=1018.2226.3001.4187
到此数据库备份与恢复圆满结束
标签:python,备份,sql,mkdir,mysqldump,MySQL,docker,数据库 From: https://www.cnblogs.com/beijie/p/17408791.html