热门标签 | 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

 



 

 

 





 

 

 

 

 

 

 

 




推荐阅读
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 本文介绍了如何使用Flume从Linux文件系统收集日志并存储到HDFS,然后通过MapReduce清洗数据,使用Hive进行数据分析,并最终通过Sqoop将结果导出到MySQL数据库。 ... [详细]
  • 本文详细介绍了如何在 Linux 系统上安装 JDK 1.8、MySQL 和 Redis,并提供了相应的环境配置和验证步骤。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 在 Ubuntu 中遇到 Samba 服务器故障时,尝试卸载并重新安装 Samba 发现配置文件未重新生成。本文介绍了解决该问题的方法。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 通过使用Sqoop导入工具,可以精确控制并高效地将表数据的特定子集导入到HDFS中。具体而言,可以通过在导入命令中添加WHERE子句来指定所需的数据范围,从而在数据库服务器上执行相应的SQL查询,并将查询结果高效地存储到HDFS中。这种方法不仅提高了数据导入的灵活性,还确保了数据的准确性和完整性。 ... [详细]
  • 在什么情况下MySQL的可重复读隔离级别会导致幻读现象? ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 在使用 Cacti 进行监控时,发现已运行的转码机未产生流量,导致 Cacti 监控界面显示该转码机处于宕机状态。进一步检查 Cacti 日志,发现数据库中存在 SQL 查询失败的问题,错误代码为 145。此问题可能是由于数据库表损坏或索引失效所致,建议对相关表进行修复操作以恢复监控功能。 ... [详细]
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社区 版权所有