热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:Python数据库MySQL之数据备份pymysql模块

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python数据库MySQL之数据备份pymysql模块相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python数据库MySQL之数据备份pymysql模块相关的知识,希望对你有一定的参考价值。






 


一 IDE工具介绍

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

下载链接:https://pan.baidu.com/s/1bpo5mqj


掌握:
#1. 测试+链接数据库
#
2. 新建库
#
3. 新建表,新增字段+类型+约束
#
4. 设计表:外键
#
5. 新建查询
#
6. 备份库/表
#注意:
批量加注释:ctrl+?键
批量去注释:ctrl
+shift+?键


二 MySQL数据备份


#1. 物理备份: 直接复制数据库文件,适用于大型数据库环境。但不能恢复到异构系统中如Windows。
#
2. 逻辑备份: 备份的是建表、建库、插入等操作所执行SQL语句,适用于中小型数据库,效率相对较低。
#
3. 导出表: 将表导入到文本文件中。 

一、使用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 

二、恢复逻辑备份


#方法一:
[root@egon backup]# mysql -uroot -p123
#方法二:
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;
 

三、备份/恢复案例



#数据库备份/恢复实验一:数据库损坏
备份:
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文件
注意事项:
1. 完全恢复到一个干净的环境(例如新的数据库或删除原有的数据库)
2. 恢复期间所有SQL语句不应该记录到binlog中


View Code

四、实现自动化备份



备份计划:
1. 什么时间 2:00
2. 对哪些数据库备份
3. 备份文件放的位置
备份脚本:
[root@egon
~]# 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@egon
~]# chmod a+x /mysql_back.sql
[root@egon ~]# chattr +i /mysql_back.sql
[root@egon ~]# /mysql_back.sql

配置cron:
[root@egon
~]# crontab -l
2 * * * /mysql_back.sql


View Code

五、表的导出和导入



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


View Code


#可能会报错
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
重新执行上述语句


报错:Variable \'secure_file_priv\' is a read only

六、数据库迁移


务必保证在相同版本之间迁移
# mysqldump -h 源IP -uroot -p123 --databases db1 | mysql -h 目标IP -uroot -p456


三 pymysql模块


#安装
pip3 install pymysql

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


import pymysql
user
=input(\'用户名: \').strip()
pwd
=input(\'密码: \').strip()
#链接
cOnn=pymysql.connect(host=\'localhost\',user=\'root\',password=\'123\',database=\'egon\',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(\'登录失败\')

二 execute()之sql注入

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

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


最后那一个空格,在一条sql语句中如果遇到select * from t1 where id > 3 -- and name=\'egon\';则--之后的条件被注释掉了
#1、sql注入之:用户存在,绕过密码
egon\' -- 任意字符
#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的规矩来。

三 增、删、改: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()


View Code

四 查:fetchone,fetchmany,fetchall



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)
\'\'\'


View Code

五 获取插入的最后一条数据的自增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()


View Code

 



 

 

 





 

 

 

 

 

 

 

 




推荐阅读
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Python项目实战10.2:MySQL读写分离性能优化
    本文介绍了在Python项目实战中进行MySQL读写分离的性能优化,包括主从同步的配置和Django实现,以及在两台centos 7系统上安装和配置MySQL的步骤。同时还介绍了创建从数据库的用户和权限的方法。摘要长度为176字。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • MySQL5.6.40在CentOS764下安装过程 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 本文介绍了如何使用PHP代码将表格导出为UTF8格式的Excel文件。首先,需要连接到数据库并获取表格的列名。然后,设置文件名和文件指针,并将内容写入文件。最后,设置响应头部,将文件作为附件下载。 ... [详细]
  • Python操作MySQL(pymysql模块)详解及示例代码
    本文介绍了使用Python操作MySQL数据库的方法,详细讲解了pymysql模块的安装和连接MySQL数据库的步骤,并提供了示例代码。内容涵盖了创建表、插入数据、查询数据等操作,帮助读者快速掌握Python操作MySQL的技巧。 ... [详细]
  • 本文介绍了使用数据库管理员用户执行onstat -l命令来监控GBase8s数据库的物理日志和逻辑日志的使用情况,并强调了对已使用的逻辑日志是否及时备份的重要性。同时提供了监控方法和注意事项。 ... [详细]
author-avatar
小布丁她Daddy
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有