假设,MySQL的连接信息如下:

  • host: 192.168.1.4
  • port: 3306
  • user: root
  • password: mypassword

现在,我们需要对这台服务器上的数据库进行备份。从MySQL导出数据需要用到mysqldump工具,不论写不写Python脚本。

一、不编写Python脚本

备份全部数据库数据到一个sql文件(包括了mysql、sys、information_schema、performance_schema等内置数据库):

mysqldump -h192.168.1.4 -uroot -pmypassword -A > mysql_backup.sql

排除掉指定数据库,并备份其他所有数据库数据到一个sql文件:

mysql -e "show databases;" -h192.168.1.4 -uroot -pmypassword | grep -Ev "Database|mysql|sys|information_schema|performance_schema" | xargs mysqldump -h192.168.1.4 -uroot -pmypassword --databases > mysql_backup.sql

备份指定的几个数据库(假设要备份两个数据库,名称分别为db1和db2)数据到一个文件:

mysqldump -h192.168.1.4 -uroot -pmypassword --databases db1 db2 > mysql_backup.sql

一般来说,不用编写Python脚本,只在命令行中使用mysqldump就能完成一键备份的功能。

二、编写Python脚本

那我还编写Python脚本干嘛?

emmm,主要是想灵活一点,比如我想把每个数据库单独备份成一个sql文件,并都保存在同一个目录下面。想达到这个目的,要么手动执行很多条命令,要么就编写脚本。写脚本并不限制用什么语言,写个shell脚本也没问题,不过我更习惯用Python,所以我用Python来写。

# -*- coding: utf-8 -*-
# @File  : mysql_backup.py
# @Author: AaronJny
# @Date  : 2019/11/19
# @Desc  : 使用Python脚本,批量备份MySQL数据库结构和数据
import logging
import os
import subprocess
import pymysql# 设置日志输出格式
logging.basicConfig(format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s',level=logging.INFO)# MySQL数据库用户名
MYSQL_USERNAME = 'root'
# 数据库密码
MYSQL_PASSWORD = 'mypassword'
# 数据库主机地址
MYSQL_HOST = '192.168.1.4'
# 数据库端口
MYSQL_PORT = 3306
# 备份文件存放路径
BACKUP_PATH = 'backup'
# 排除,不进行备份操作的数据库名称集合
DISABLED_DATABASES = {'information_schema', 'mysql', 'performance_schema', 'sys'}def mkdir_if_not_exists(path):"""判断给定目录是否存在,不存在则创建它Args:path: 带创建目录名称"""if not os.path.exists(path):os.mkdir(path)def create_mysql_conn(db='mysql'):"""创建并返回一个mysql数据库连接Args:db: 要连接的数据库名称Returns:"""conn = pymysql.connect(host=MYSQL_HOST, port=MYSQL_PORT, user=MYSQL_USERNAME, password=MYSQL_PASSWORD, db='mysql')return conndef read_all_databases():"""从数据库中读取全部数据库名称Returns:list,数据库名称列表"""logging.info('读取全部数据库名称...')conn = create_mysql_conn()cursor = conn.cursor()# 查询服务器上有哪些数据库cursor.execute('show databases')res = cursor.fetchall()databases = {item[0] for item in res}# 排除掉指定不备份的数据库databases = list(databases - DISABLED_DATABASES)cursor.close()conn.close()logging.info('读取完毕,数据库列表如下:{}'.format(databases))return databasesdef backup_database(database):"""备份指定数据库的数据和表结构Args:database: 待备份的数据库名称"""logging.info('开始备份数据库 {}...'.format(database))# 通过调用mysqldump完成指定数据库的备份command = 'mysqldump -h192.168.1.4 -uroot -p666 --add-drop-database --databases {database} > {backup_path}/{database}.sql'.format(database=database,backup_path=BACKUP_PATH)exit_code = subprocess.call(command, shell=True)# 判断命令是否正常执行,异常则直接抛出if exit_code != 0:raise Exception('在备份数据库的过程中出错,请检查!')logging.info('数据库 {} 备份完毕!'.format(database))def backup():"""读取全部数据库名称,并对这些数据库的数据和结构进行备份"""# 检查备份路径是否存在,不存在则进行创建mkdir_if_not_exists(BACKUP_PATH)# 读取全部待备份数据库名称databases = read_all_databases()# 逐个对数据库进行备份for database in databases:backup_database(database)if __name__ == '__main__':backup()

代码有写注释,就不多说了,直接看代码吧。简单配置一下,并执行这个脚本,即可一键备份数据库到指定路径。

如果我们想使用备份的数据恢复数据库怎么办呢?我们再编写一个恢复用的脚本。注意,备份的数据库服务器,和恢复的数据库服务器,可以不是同一台服务器,所以这个脚本也可以用于数据库迁移的场景。

另外,请注意,当目标数据库中已经有同名的数据库了,会先删除同名数据库,再重新创建并恢复数据。请确认这个逻辑是否和你的需求相符,并谨慎操作。

# -*- coding: utf-8 -*-
# @File  : mysql_recovery.py
# @Author: AaronJny
# @Date  : 2019/11/19
# @Desc  : 使用Python脚本,使用备份的MySQL数据库结构和数据进行恢复
import logging
import os
import subprocess
import pymysql# 设置日志输出格式
logging.basicConfig(format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s',level=logging.INFO)# MySQL数据库用户名
MYSQL_USERNAME = 'root'
# 数据库密码
MYSQL_PASSWORD = 'mypassword'
# 数据库主机地址
MYSQL_HOST = '192.168.1.4'
# 数据库端口
MYSQL_PORT = 3306
# 备份文件存放路径
BACKUP_PATH = 'backup'logging.info('开始获取需要恢复的数据库文件...')
files = list(os.listdir(BACKUP_PATH))logging.info('文件列表:{}'.format(files))# 开始逐个恢复数据库
for file in files:logging.info('开始恢复数据库 {}...'.format(file.split('.')[0]))command = 'mysql -h{host} -f -u{user} -p{password} -P{port} < {path}/{file}'.format(host=MYSQL_HOST,user=MYSQL_USERNAME,password=MYSQL_PASSWORD,port=MYSQL_PORT, file=file,path=BACKUP_PATH)subprocess.call(command, shell=True)
logging.info('完毕!')

好的,大功告成!


参考文章:

mysqldump导出多数据库操作

使用Python3编写脚本一键备份MySQL数据库相关推荐

  1. 编写一键备份MYSQL数据库脚本; 一键Nginx虚拟主机添加、删除脚本;

    1.编写一键备份MYSQL数据库脚本: 1)支持任意单个或者多个数据库的备份: 2)支持多个数据库.所有库备份: 思路: 备份mysql数据库命令 #到处mysql所有库的数据到mysql_all.s ...

  2. 一键备份MYSQL数据库脚本

    编写一键备份MYSQL数据库脚本: 1)支持单个任意数据库的备份: 2)支持多个数据库同时备份: 3)支持所有数据库同时备份. 备份单个数据库 #!/bin/bash #mysql DB backup ...

  3. 编写一键备份MYSQL数据库脚本

    远程备份mysql数据库 1.mysql需要有远程访问权限 这里我为了方便,就设置所有地址都可以访问了.如果没有,在数据库中执行如下命令 创建备份用户及授权 >grant select,lock ...

  4. shell脚本自动备份MySQL数据库

    脚本如下: #!/bin/bash #数据库IP dbserver='127.0.0.1' #数据库用户名 dbuser='root' #数据密码 dbpasswd='123456' #数据库,如有多 ...

  5. 一键备份MySQL数据库

    将如下代码另存为.bat文件 @echo off echo. echo      MySQL数据库备份 echo ***************************** echo. echo 今天 ...

  6. 如何在linux下写脚本定时备份mysql数据库

    我们在工作中可以这么做减少数据丢失概率 1. 先在某个文件夹下创建一个脚本,这里命名为back_up_database.sh,在/mnt/data_dump/这目录下 #!/bin/bash base ...

  7. shell date mysql_shell脚本定时备份mysql数据库

    #!/bin/sh # 定义用于备份数据库的用户名和密码 user=root userPWD=123456 # 定义备份数据库名称 dbNames=(web_portal) # 定义备份目录 data ...

  8. Centos定时备份 MySQL数据库

    一.编写数据库备份脚本 backupmysql.sh #!/bin/bash # Name:bakmysql.sh # This is a ShellScript For Auto DB Backup ...

  9. centos7-每天定时备份 mysql数据库

    centos7-每天定时备份 mysql数据库 第一步:编写数据库备份脚本database_mysql_shell.sh #!/bin/bash DATE=`date +%Y%m%d%H%M` #ev ...

最新文章

  1. 行人重识别技术不断突破 安防企业力拔头筹
  2. 人人可以理解的区块链100问——比特币可以用于支付吗?
  3. 【剑指offer - C++/Java】13、调整数组顺序使奇数位于偶数前面
  4. append追加的html中富文本失效,jquery append 动态添加的元素事件on 不起作用的解决方案...
  5. 第三节 UNIX文件系统结构
  6. python中delay__python delay函数
  7. Python学习笔记4---类和对象
  8. 厦大C语言上机 1357 小明的考题2――数与单词
  9. 顺序主子式的英文翻译(定义)
  10. 知名网络漫画XKCD被黑客攻击,约56万用户数据被泄露
  11. 家长们,居家网课这样做
  12. android 7 audio架构,GitHub - zozo825117/ble_audio_android: android audio框架
  13. ch340预安装成功,但是就是无法识别 也无法卸载 怎么办?
  14. [CTFHub] 2021-第四届红帽杯网络安全大赛-Web-find_it
  15. 自己怎么做引流推广?利用QQ群截流日引流量100
  16. 计算机毕业设计太难不会做怎么办?
  17. Python脚本和图片相互转换
  18. bootstratreeview树形下拉框
  19. 全网最强,接口自动化测试框架的设计与实现,精心整理,掌控自我拿高薪
  20. 山水之道第二境——精灵的世界之城

热门文章

  1. 单细胞分析实录(14): 细胞类型注释的另一种思路 — CellID
  2. 单细胞基础分析 | 基因细胞类型特异性富集分析
  3. python series转置储存到excel_Python 实现Excel自动化办公下
  4. 京东店被曝刷单金额过亿
  5. Dependency(依赖)
  6. word中公式与字体不对齐怎么处理
  7. vue前后台跨越请求简单总结
  8. Bee常见疑问收集(V1.9.8)
  9. 8g内存和16g内存区别 mac_苹果8g和16g的区别大盘点
  10. DataGrid活用