Python进行MySQL数据备份与增删改查操作实战指南

 更新时间:2025年07月04日 10:16:23   作者:懂搬砖  
Python是一种强大且易于学习的编程语言,这篇文章主要为大家详细介绍了mysql数据库备份以及利用pymysql模块进行数据库增删改查的相关操作

一、IDE工具介绍

生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用Navicat之类的IDE工具。

二、MySQL 数据备份

1. 备份类型

物理备份

直接复制数据库文件,这种方式适用于大型数据库环境。不过,它存在一定局限性,不能恢复到异构系统中,例如不能从 Linux 环境恢复到 Windows 环境。

逻辑备份

备份的是建表、建库、插入等操作所执行的 SQL 语句,比较适合中小型数据库。但相对物理备份,其效率较低。

导出表

将表导入到文本文件中,方便数据的存储和转移。

2. 使用 mysqldump 实现逻辑备份

语法

# mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份文件.sql

示例

单库备份

mysqldump -uroot -p123 db1 > db1.sql
mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql

库备份

mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql

备份所有库

mysqldump -uroot -p123 --all-databases > all.sql 

3. 恢复逻辑备份

方法一

[root@egon backup]# mysql -uroot -p123 < /backup/all.sql

方法二

mysql> use db1;
mysql> SET SQL_LOG_BIN=0;
mysql> source /root/db1.sql

如果备份/恢复单个库时,可以修改 sql 文件,示例如下:

DROP database if exists school;
create database school;
use school; 

4. 备份/恢复案例

数据库备份/恢复实验一:数据库损坏

备份步骤

1. # mysqldump -uroot -p123 --all-databases > /backup/`date +%F`_all.sql

2. # mysql -uroot -p123 -e 'flush logs' //截断并产生新的 binlog

3. 插入数据 //模拟服务器正常运行

4. mysql> set sql_log_bin=0; //模拟服务器损坏

mysql> drop database db;

恢复步骤

1. # mysqlbinlog 最后一个 binlog > /backup/last_bin.log

2. mysql> set sql_log_bin=0; 

mysql> source /backup/2014-02-13_all.sql //恢复最近一次完全备份 
mysql> source /backup/last_bin.log //恢复最后个 binlog 文件

数据库备份/恢复实验二:如果有误删除

备份步骤

1. mysqldump -uroot -p123 --all-databases > /backup/`date +%F`_all.sql

2. mysql -uroot -p123 -e 'flush logs' //截断并产生新的 binlog

3. 插入数据 //模拟服务器正常运行

4. drop table db1.t1 //模拟误删除

5. 插入数据 //模拟服务器正常运行

恢复步骤

1. # mysqlbinlog 最后一个 binlog --stop-position=260 > /tmp/1.sql 

# mysqlbinlog 最后一个 binlog --start-position=900 > /tmp/2.sql 

2. mysql> set sql_log_bin=0; 

mysql> source /backup/2014-02-13_all.sql //恢复最近一次完全备份
mysql> source /tmp/1.log //恢复最后个 binlog 文件
mysql> source /tmp/2.log //恢复最后个 binlog 文件

注意事项

  • 完全恢复到一个干净的环境(例如新的数据库或删除原有的数据库)。
  • 恢复期间所有 SQL 语句不应该记录到 binlog 中。

5. 实现自动化备份

备份计划

  • 时间:2:00
  • 备份数据库:可根据需求指定
  • 备份文件位置:可自定义

备份脚本

[root@xiao ~]# vim /mysql_back.sql
#!/bin/bash
back_dir=/backup
back_file=`date +%F`_all.sql
user=root
pass=123

if [ ! -d /backup ];then
mkdir -p /backup
fi

# 备份并截断日志
mysqldump -u${user} -p${pass} --events --all-databases > ${back_dir}/${back_file}
mysql -u${user} -p${pass} -e 'flush logs'

# 只保留最近一周的备份
cd $back_dir
find . -mtime +7 -exec rm -rf {} \;

手动测试

[root@xiao ~]# chmod a+x /mysql_back.sql 
[root@xiao ~]# chattr +i /mysql_back.sql
[root@xiao ~]# /mysql_back.sql

配置 cron

[root@xiao ~]# crontab -l
2 * * * /mysql_back.sql

6. 表的导出和导入

SELECT… INTO OUTFILE 导出文本文件

mysql> SELECT * FROM school.student1
INTO OUTFILE 'student1.txt'
FIELDS TERMINATED BY ',' //定义字段分隔符
OPTIONALLY ENCLOSED BY '”' //定义字符串使用什么符号括起来
LINES TERMINATED BY '\n' ; //定义换行符

mysql 命令导出文本文件

# mysql -u root -p123 -e 'select * from student1.school' > /tmp/student1.txt
# mysql -u root -p123 --xml -e 'select * from student1.school' > /tmp/student1.xml
# mysql -u root -p123 --html -e 'select * from student1.school' > /tmp/student1.html

LOAD DATA INFILE 导入文本文件

mysql> DELETE FROM student1;
mysql> LOAD DATA INFILE '/tmp/student1.txt'
INTO TABLE school.student1
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '”'
LINES TERMINATED BY '\n';

在导出文件时可能会报错,例如:

mysql> select * from db1.emp into outfile 'C:\\db1.emp.txt' fields terminated by ',' lines terminated by '\r\n';
ERROR 1238 (HY000): Variable 'secure_file_priv' is a read only variable

这是因为 MySQL 为了安全考虑,对文件导出位置作了限制。需要在配置文件中设置:

[mysqld]
secure_file_priv='C:\\' #只能将数据导出到 C:\\ 下

重启 MySQL 后重新执行导出语句。

7. 数据库迁移

务必保证在相同版本之间迁移,示例命令如下:

# mysqldump -h 源 IP -uroot -p123 --databases db1 | mysql -h 目标 IP -uroot -p456

三、pymysql 模块

1. 安装

pip3 install pymysql

2. 链接、执行 sql、关闭(游标)

import pymysql
user=input('用户名: ').strip()
pwd=input('密码: ').strip()

# 链接
conn=pymysql.connect(host='localhost',user='root',password='123',database='xiao',charset='utf8')
# 游标
cursor=conn.cursor() # 执行完毕返回的结果集默认以元组显示
# cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)

# 执行 sql 语句
sql='select * from userinfo where name="%s" and password="%s"' %(user,pwd) # 注意 %s 需要加引号
print(sql)
res=cursor.execute(sql) # 执行 sql 语句,返回 sql 查询成功的记录数目
print(res)

cursor.close()
conn.close()

if res:
    print('登录成功')
else:
    print('登录失败')

3. execute() 之 sql 注入

最后那一个空格,在一条sql语句中如果遇到select * from t1 where id > 3 -- and name='xiao';则--之后的条件被注释掉了

#1、sql注入之:用户存在,绕过密码
xiao' -- 任意字符

#2、sql注入之:用户不存在,绕过用户与密码
xxx' or 1=1 -- 任意字符

解决方法:

# 原来是我们对 sql 进行字符串拼接
# sql="select * from userinfo where name='%s' and password='%s'" %(user,pwd)
# print(sql)
# res=cursor.execute(sql)

# 改写为(execute 帮我们做字符串拼接,我们无需且一定不能再为 %s 加引号了)
sql="select * from userinfo where name=%s and password=%s" # !!!注意 %s 需要去掉引号,因为 pymysql 会自动为我们加上
res=cursor.execute(sql,[user,pwd]) # pymysql 模块自动帮我们解决 sql 注入的问题,只要我们按照 pymysql 的规矩来。

4. 增、删、改:conn.commit()

import pymysql
# 链接
conn=pymysql.connect(host='localhost',user='root',password='123',database='xiao')
# 游标
cursor=conn.cursor()

# 执行 sql 语句
# part1
# sql='insert into userinfo(name,password) values("root","123456");'
# res=cursor.execute(sql) # 执行 sql 语句,返回 sql 影响成功的行数
# print(res)

# part2
# sql='insert into userinfo(name,password) values(%s,%s);'
# res=cursor.execute(sql,("root","123456")) # 执行 sql 语句,返回 sql 影响成功的行数
# print(res)

# part3
sql='insert into userinfo(name,password) values(%s,%s);'
res=cursor.executemany(sql,[("root","123456"),("lhf","12356"),("eee","156")]) # 执行 sql 语句,返回 sql 影响成功的行数
print(res)

conn.commit() # 提交后才发现表中插入记录成功
cursor.close()
conn.close()

5. 查:fetchone,fetchmany,fetchall

import pymysql
# 链接
conn=pymysql.connect(host='localhost',user='root',password='123',database='xiao')
# 游标
cursor=conn.cursor()

# 执行 sql 语句
sql='select * from userinfo;'
rows=cursor.execute(sql) # 执行 sql 语句,返回 sql 影响成功的行数 rows,将结果放入一个集合,等待被查询

# cursor.scroll(3,mode='absolute') # 相对绝对位置移动
# cursor.scroll(3,mode='relative') # 相对当前位置移动
res1=cursor.fetchone()
res2=cursor.fetchone()
res3=cursor.fetchone()
res4=cursor.fetchmany(2)
res5=cursor.fetchall()
print(res1)
print(res2)
print(res3)
print(res4)
print(res5)
print('%s rows in set (0.00 sec)' %rows)

conn.commit() # 提交后才发现表中插入记录成功
cursor.close()
conn.close()

6. 获取插入的最后一条数据的自增 ID

import pymysql
conn=pymysql.connect(host='localhost',user='root',password='123',database='xiao')
cursor=conn.cursor()

sql='insert into userinfo(name,password) values("xxx","123");'
rows=cursor.execute(sql)
print(cursor.lastrowid) # 在插入语句后查看

conn.commit()

cursor.close()
conn.close()

到此这篇关于Python进行MySQL数据备份与增删改查操作实战指南的文章就介绍到这了,更多相关Python MySQL操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • pytest配置文件pytest.ini的配置、原理与实际应用详解

    pytest配置文件pytest.ini的配置、原理与实际应用详解

    在Python的测试生态中,pytest无疑是最受欢迎的测试框架之一,在pytest的众多配置文件中,pytest.ini无疑是最为重要和常用的一个,本文将深入探讨pytest.ini的配置、工作原理以及实际应用场景,帮助读者更好地理解和使用这一强大的工具,需要的朋友可以参考下
    2025-03-03
  • Python如何向现有的DataFrame添加新列示例代码

    Python如何向现有的DataFrame添加新列示例代码

    Pandas库中的DataFrame是处理表格数据的主要数据结构,添加新列有多种方法,包括使用现有列的值、创建全为零或全为一的列、或者直接添加一个由特定值组成的列,这些方法在处理数据时非常有用,需要的朋友可以参考下
    2024-11-11
  • 【Python】Python的urllib模块、urllib2模块批量进行网页下载文件

    【Python】Python的urllib模块、urllib2模块批量进行网页下载文件

    这篇文章主要介绍了Python的urllib模块、urllib2模块批量进行网页下载文件,就是一个简单的从网页抓取数据、下载文件的小程序,需要的可以了解一下。
    2016-11-11
  • 使用python查找windows系统中所有程序的安装信息

    使用python查找windows系统中所有程序的安装信息

    这篇文章主要为大家介绍了使用python查找windows系统中所有程序的安装信息示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • pycharm指定python路径过程详解

    pycharm指定python路径过程详解

    这篇文章主要介绍了Pycharm指定python路径过程图解,文中通过示例代码介绍的非常详细,对大家的学习具有一定的参考学习价值,需要的朋友可以参考下
    2023-04-04
  • Python使用plotly绘制数据图表的方法

    Python使用plotly绘制数据图表的方法

    本篇文章主要介绍了Python使用plotly绘制数据图表的方法,实例分析了plotly绘制的技巧,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • python自动发邮件库yagmail的示例代码

    python自动发邮件库yagmail的示例代码

    本篇文章主要介绍了python自动发邮件库yagmail的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Python使用文件操作实现一个XX信息管理系统的示例

    Python使用文件操作实现一个XX信息管理系统的示例

    这篇文章主要介绍了Python使用文件操作实现一个XX信息管理系统的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Python开发之QT解决无边框界面拖动卡屏问题(附带源码)

    Python开发之QT解决无边框界面拖动卡屏问题(附带源码)

    朋友在学习QT的过程中,都会遇到各种问题,今天就QT无边框拖动花屏问题给大家详细介绍,究竟该如何解决呢,下面通过实例代码和图文相结合给大家详细介绍,需要的朋友参考下吧
    2021-05-05
  • Python找出list中最常出现元素的方法

    Python找出list中最常出现元素的方法

    这篇文章主要介绍了Python找出list中最常出现元素的方法,给出了三种常用的方法供大家对比参考,需要的朋友可以参考下
    2016-06-06

最新评论