您的位置:首页 > 编程语言 > Python开发

SQL学习:mysql数据库备份和使用日志恢复+python调用mysql方法(4)

2015-11-23 20:19 1106 查看
<span style="font-size:14px;">--EmpAndDept5
--主要关于更新表格、数据库备份、日志的开启、删除和通过python来调用mysql

--将select的数据返回创建一个新表
create table emp2 as
select empno,sal from emp where 1=0;
--这种方式可以创建一个包含列字段但是没有数据的方法,因为后面的where始终为false

--将depno为20的部门的每个员工的薪水更新为现在的110%,要求永久保存,使用update
update emp set sal=sal*1.1 where deptno=10;

--仅更新在emp_bonus中有奖金的人的薪水(1.1倍)
update emp set sal=sal*1.1 where empno in (select empno from emp_bonus);
--使用exists实现跟in一样的功能
update emp e set sal=sal*1.1 where exists(select null from emp_bonus eb where e.empno=eb.empno);
--记住任何时候都要记得where,除非你想全部的数据都更新

--删除重复数据,先insert一个,因为主键的原因,empno不一样,但是我们知道这两就是一个人,是重复的
insert into emp(ename,job,mgr,hiredate,sal,comm,deptno) values('smith','clerk',7902,1980-12-27,1064.80,null,10);
delete from emp where empno not in (select max(empno) from emp group by ename);
--这时会发现delete报错了,原因是因为修改一个表和子查询不能是同一个表(不知道为啥书上的就可以通过。。。)
--有一个办法是将他变成孙子查询!
delete from emp where empno not in (select * from (select max(empno) from emp group by ename) a );

--删除表格
--delete和drop的区别,delete删除的是数据,表列元素还在,drop删除的是整个表
delete from pet;
drop table pet;
--删除单个记录
delete from emp where empno=1000;

--数据库备份和恢复
--有几种方法:
--No.1 土方法:找到电脑上存放mysql数据库的文件夹(一般默认是在mysql文件夹的data里),直接复制文件夹中数据库内的内容....
--             需要恢复的时候就创建一个新数据库将内容复制进去覆盖就行了
--       缺点:依赖于windows的文件存储系统,不能移植到其他类型机器上

--No.2 mysqldump法
--cmd模式下进到bin目录下输入:mysqldump -u root -p basename > backup.sql
--basename为你要备份的数据库名字,backup为导出的文件名,会在bin下生成back.sql文件,或者你在backup.sql前加上路径如:C:\安装文件备份\backup.sql
--提示locktable错误则在basename后面加上--skip-lock-tables
--恢复数据库
--从cmd进入数据库界面,执行以下命令,即可
create database restoretest;
use RestoreTest;
source C:/User/backup.sql;  --注:路径最好不要包含中文,我用了中文结果source不到了
--    路径最好用/而不是\,source下容易因为转义字符的存在而出错,否则这里要用\\
--      优点:生成的文件可移植到其他机器上
--      缺点:速度较慢

--No.3 采用第三方软件备份(这里就不介绍了)

--日志
--其中的二进制日志记载了你的一系列sql操作,如当系统崩溃,数据库资料丢失,我们通过数据库备份文件恢复之后,
--可以让服务器执行二进日志,将数据库恢复到崩溃之前的状态
--可以通过以下命令查看是否开启了相关的日志:
show global variables like '%log%';
show global variables like 'log_bin';
show binary logs;     --查看二进制日志
show master status;   --查看当前使用的日志(主要查看现在是用的哪个二进制日志)

--要永久开启二进制日志和其他日志,可以配置my.ini文件,配置方法可以查看我的另一篇博文:http://blog.csdn.net/databatman/article/details/49951853
--注:网上大部分的配置都是针对mysql5.6版本以前的,基本已经过时了,此配置方法是针对mysql5.6.x以后版本的

--关于使用日志恢复数据库的博文    http://blog.csdn.net/alvine008/article/details/9097105 --本来想自己写一个,后来发现这个已经写得很nice了,毕竟现在的我还没在企业实践过,写出来也是半吊子,就不写啦

--综上,时间轴一般是:
--   1.备份数据库,同时启动了二进制日志
--   2.一段时间后,数据库意外崩溃
--   3.使用以前的数据库备份来恢复数据库
--   4.同时调用从备份到崩溃前的日志恢复数据库到崩溃前状态

--删除数据库
drop database if exists Heros;  --如果存在,就删除

--用python来调用mysql数据库
--参见本篇博文:
--或者见另一个代码文件:python-mysql.py

</span>


python调用mysql:

先安装python与mysql的关联库:在python的script文件夹中,cmd模式下输入:

pip install mysql-connector-python --allow-external mysql-connector-python


#!usr/bin/env python
#-*- coding:utf-8 -*-

import mysql.connector   #mysql-connector-python包

#connect用于连接数据库
#cursor.execute用于执行create、insert、update、select等等一系列语句

#创建一个连接数据库的对象con、cursor
con=mysql.connector.connect(host='localhost',user='root',password='1991423',database='cookbook',use_unicode=True)
cursor=con.cursor()

#创建表格
sql1=u"create table pytest (id int primary key,name varchar(20),sex nchar(1) default '男' check(sex in ('男','女')))"
cursor.execute(sql1)

#插入数据的两种写法

#1、小心这种写法,回想一下mysql的插入语句,因为mysql本身在插入数据时字符串就要加'',
#   所以你写的让execute传人数据库的语句也要包含'',包含的方法有:
#           ①外面用双引号"",内部就可以用单引号而不冲突了
#           ②用转义字符\'即可
cursor.execute(u"insert into pytest values(1,'bob','男')")

#2、推荐!
#考虑到数据库是开放用来给用户查询的,所以时常需要修改输入的值,因此这种方法用的较多
sql2=u'insert into pytest values(%s,%s,%s)'
parameter=[2,'Kate','女']
cursor.execute(sql2,parameter)

#将insert的数据更新储存到数据库
con.commit()

#在数据库的操作界面用selcet * from pytest会发现id=2女生那栏显示的是乱码(可能你的不会遇到)
#原因是上面的代码在传入中文的时候两者的编码可能不一样导致,可以如下用unicode格式更新一下
#顺便复习下update语句
sql3=u'update pytest set sex=%s where id=%s'
parameter=[u'女',2]
cursor.execute(sql3,parameter)
con.commit()

#查询select
cursor.execute('select * from pytest')
#使用fetchall获得所有的返回值
#还有fetchone返回一个,fetchmany返回多个,scroll函数等
#返回的是list,内部每个实例都是tuple
values=cursor.fetchall()

n=cursor.rowcount  #统计execute影响到的行数,像select选出了2行,所以这里n=2
print values
print n

#注:每次调用完select都必须fetchall,才能进行下一次的查询,否则会报错

#记得关闭cursor和conn,避免数据库泄露
cursor.close()
con.close()
#为了避免在执行出错的时候仍然能关闭数据库,多要跟try except finally结合


python调用mysql这块主要参考了廖雪峰大大的博客,我自己加了点理解:

http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014320107391860b39da6901ed41a296e574ed37104752000

mysql代码github地址:

https://github.com/databatman/SQLCookBook-MysqlVersion

PS:所有的mysql的EmpAnd1-n代码都会上传到这个文件夹,顺便求关注啊,虽然还是菜鸟一个,啊哈
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: