Python MySQL 备份_Python--MySQL系列 数据备份 pymysql模块

本文介绍了使用Python的pymysql模块进行MySQL数据库的备份和恢复操作,包括逻辑备份的mysqldump命令,以及如何通过pymysql执行SQL语句进行数据的增删改查。同时,文章还讨论了SQL注入问题及其解决方案。
摘要由CSDN通过智能技术生成

MySQL数据备份

#1. 物理备份: 直接复制数据库文件,适用于大型数据库环境。但不能恢复到异构系统中如Windows。

#2. 逻辑备份: 备份的是建表、建库、插入等操作所执行SQL语句,适用于中小型数据库,效率相对较低。

#3. 导出表: 将表导入到文本文件中。

库的备份与恢复

1.逻辑备份:使用mysqldump实现

48304ba5e6f9fe08f3fa1abda7d326ab.png

语法 :

mysqldump -h 服务器 -u用户名 -p密码 库名 > 路径\备份文件.sql

#单库备份

mysqldump -uroot -p --database db1 > E:\db1_20171030.sql

#多库备份

mysqldump -uroot -p --databases aaa bbb ccc > E:\aaa_bbb_ccc_20171030.sql

#备份所有库

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

48304ba5e6f9fe08f3fa1abda7d326ab.png

2.恢复逻辑备份:

语法:

mysql -u用户名 -p密码 < 路径\备份文件.sql

#单库备份,多库备份,所有库备份

mysql -uroot -p < C:\\day45_bak_2017_10_30.sql

表的备份与恢复

48304ba5e6f9fe08f3fa1abda7d326ab.png

备份单表

mysqldump -u用户 -p密码 库名 表名 > 路径\备份文件名.sql

备份多表

mysqldump -u用户 -p密码 库名 表名,表名2,表名3 > 路径\备份文件名.sql

恢复单表,恢复多表

mysql -u用户 -p密码 库名 < 路径\备份文件名.sql

#备份多个表 例子

mysqldump -uroot -p day45 employee t1 t2 > C:\\day45_t1_t2_employee_bak_2017_10_30.sql

恢复表

mysql -uroot -p day45 < C:\\day45_t1_t2_employee_bak_2017_10_30.sql

48304ba5e6f9fe08f3fa1abda7d326ab.png

表的导入导出 (数据的导入导出)

48304ba5e6f9fe08f3fa1abda7d326ab.png

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';

48304ba5e6f9fe08f3fa1abda7d326ab.png

数据库迁移

务必保证在相同版本之间迁移

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

pymysql模块

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

#安装

pip3 install pymysql

48304ba5e6f9fe08f3fa1abda7d326ab.png

import pymysql

user=input('用户名: ').strip()

pwd=input('密码: ').strip()

#创建链接

conn=pymysql.connect(

host='localhost',

port=3306,

user='root',

password='',

database='zzz',

charset='utf8'

)

#游标

cursor=conn.cursor()

# cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 结果是以字典形式呈现 {字段:数据,....}

#sql语句

sql='select * from userinfo where name=%s and password=%s ;'

#执行sql语句

res=cursor.execute(sql,(user,pwd)) #执行sql语句,返回sql查询成功的记录数目

cursor.close() #游标关闭

conn.close() #链接关闭

if res:

print('登录成功')

else:

print('登录失败')

48304ba5e6f9fe08f3fa1abda7d326ab.png

二 execute()之sql注入

注意:符号--会注释掉它之后的sql,正确的语法:--后至少有一个任意字符

根本原理:就根据程序的字符串拼接name='%s',我们输入一个xxx' -- haha,用我们输入的xxx加'在程序中拼接成一个判断条件name='xxx' -- haha'

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

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

#1、sql注入之:用户存在,绕过密码

egon' -- 任意字符

#2、sql注入之:用户不存在,绕过用户与密码

xxx' or 1=1 -- 任意字符

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

291f75731918a805bac4f2f99988a5d1.png

18e6fddda5b179004c3939f78021e666.png

b0d3a95cf4272a571a779e9f728c42ec.png

解决方法:

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

# 原来是我们对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的规矩来。

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

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

import pymysql

#链接

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

#游标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()

四 查:fetchone,fetchmany,fetchall

4eeb0d92a22fe3d35aabeb63c68d0f93.png

import pymysql

#链接

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

#游标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()'''(1,'root','123456')

(2,'root','123456')

(3,'root','123456')

((4,'root','123456'), (5,'root','123456'))

((6,'root','123456'), (7,'lhf','12356'), (8,'eee','156'))

rows in set (0.00 sec)'''

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

import pymysql

conn=pymysql.connect(host='localhost',user='root',password='123',database='egon')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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值