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

三、备份/恢复案例

- #数据库备份/恢复实验一:数据库损坏
- 备份:
- 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中

四、实现自动化备份

- 备份计划:
- 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

五、表的导出和导入

- 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
- 重新执行上述语句

六、数据库迁移
- 务必保证在相同版本之间迁移
- # 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()

四 查: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)
- '''

五 获取插入的最后一条数据的自增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()
mysql 数据备份及pymysql模块的更多相关文章
- SQL学习笔记六之MySQL数据备份和pymysql模块
mysql六:数据备份.pymysql模块 阅读目录 一 IDE工具介绍 二 MySQL数据备份 三 pymysql模块 一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测 ...
- MySQL 数据备份,Pymysql模块(Day47)
阅读目录 一.IDE工具介绍 二.MySQL数据备份 三.Pymysql模块 一.IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https:/ ...
- mysql 数据备份。pymysql模块
阅读目录 一 IDE工具介绍 二 MySQL数据备份 三 pymysql模块 一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https:/ ...
- mysql七:数据备份、pymysql模块
阅读目录 一 IDE工具介绍 二 MySQL数据备份 三 pymysql模块 一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https:/ ...
- mysql六:数据备份、pymysql模块
一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 掌握: #1. 测试+链接数据库 #2. 新建库 #3. 新建表,新增字段+类型+约束 #4. 设计表 ...
- 数据备份、pymysql模块
阅读目录 一 IDE工具介绍 二 MySQL数据备份 三 pymysql模块 一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https:/ ...
- Mysql(六):数据备份、pymysql模块
一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 掌握: #1. 测试+链接 ...
- MySQL之数据备份、pymysql模块
一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 掌握: #1. 测试+链接 ...
- MySQL 第六篇:数据备份、pymysql模块
一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1O8hXkdRK5_EVHZwNPwjCB ...
随机推荐
- 007-搭建框架-开发AOP框架
一.代码地址 https://github.com/bjlhx15/smart-framework.git 二.代码编写 2.1.定义切面注解 增加Aspect注解 package com.lhx.s ...
- springboot 2.0 配置 logback
springboot2.0默认已经引入日志jar依赖,所以直接配置日志信息就可以了. 在application.properties中加入: logging.config=classpath:logb ...
- 20171104 DOI Excel 导出
1. OAOR 创建模板, Class name:SOFFICEINTEGRATIONClass type: OTObject key: ZZCSDRP_0030 2.双击表模板创建Excel 模 ...
- python区分大小写吗
如果能区分像myname和Myname这样的标识符,那么它就是区分大小写的.也就是说它很在乎大写和小写. myname='Ayushi' print(Myname) Traceback (most r ...
- Yii2 注册表单验证规则 手机注册时候使用短信验证码
public function rules() { return [ ['username', 'filter', 'filter' => 'trim'], ['username', 'requ ...
- iOS JS 和 OC交互 / JS 和 native 相互调用
现在app 上越来越多需求是通过UIWebView 来展示html 或者 html5的内容, js 和 native OC代码交互 就非常常见了. js 调用 native OC代码 第一种机制 ( ...
- Web前端开发人员和设计师必读文章推荐【系列十】
<Web前端开发人员和设计师必读文章推荐系列十>给大家带来最近两个月发布在<梦想天空>的优秀文章,特别推荐给 Web 开发人员和设计师阅读.梦天空博客关注 前端开发 技术,展示 ...
- VCS 常用命令速查
VCS是编译型Verilog模拟器,它完全支持OVI标准的Verilog HDL语言.PLI和SDF.VCS具有目前行业中最高的模拟性能,其出色的内存管理能力足以支持千万门级的ASIC设计,而其模 ...
- PHP 面向对象及Mediawiki 框架分析(一)
此文是一JAVA哥大神写的,虽然他不懂PHP.我这人PHP半桶水,面向对象更是半桶水都没有,此文原本是为了让我理解MediaWiki的运行机制的,愣是用他的JAVA的面向对象知识,对Mediawiki ...
- win7 与 Ubuntu 16.04 文件传送
win7 与 Ubuntu 16.04 文件传送 环境:主机系统为win7,虚拟机为vmware12, 虚拟系统为ubuntu 16.04 方案一: 通过虚拟机vmware的共享文件夹实现. 方案二: ...