一、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操作内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论