SQL學習:mysql數據庫備份和使用日誌恢復+python調用mysql方法(4)



<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代碼都會上傳到這個文件夾,順便求關注啊,雖然還是菜鳥一個,啊哈




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章