1. 程式人生 > >第五篇:資料備份、pymysql模組

第五篇:資料備份、pymysql模組

一 IDE工具介紹

生產環境還是推薦使用mysql命令列,但為了方便我們測試,可以使用IDE工具

掌握:
#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 

二、恢復邏輯備份

#方法一:
[[email protected] 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中
View Code

四、實現自動化備份

備份計劃:
1. 什麼時間 2:00
2. 對哪些資料庫備份
3. 備份檔案放的位置

備份指令碼:
[[email protected] ~]# 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 {} \;

手動測試:
[[email protected] ~]# chmod a+x /mysql_back.sql 
[[email protected] ~]# chattr +i /mysql_back.sql
[[email protected] ~]# /mysql_back.sql

配置cron:
[[email protected] ~]# 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

相關推薦

資料備份pymysql模組

一 IDE工具介紹 生產環境還是推薦使用mysql命令列,但為了方便我們測試,可以使用IDE工具 掌握: #1. 測試+連結資料庫 #2. 新建庫 #3. 新建表,新增欄位+型別+約束 #4. 設計表:外來鍵 #5. 新建查詢 #6. 備份庫/表 #注意: 批量加註釋:ctrl

許可權管理,資料備份pymysql模組

許可權管理 許可權管理重點 MySQL 預設有個root使用者,但是這個使用者許可權太大,一般只在管理資料庫時候才用。如果在專案中要連線 MySQL 資料庫,則建議新建一個許可權較小的使用者來連線。 在 MySQL 命令列模式下輸入如下命令可以為 MySQL 建立一個新使用者:

基本資料型別及用法(2)

1 info={"k1":"v1","k2":"v2"} 2 v=info.setdefault("k3",123) 3 print(info,v) 4 #結果:{'k1': 'v1', 'k2': 'v2', 'k3': 123} 123   字典dict 1.字典的元素是鍵值

zTree節點的一些操作,權當備份

專案場景:將zTree的一個節點挪到某個已知的根節點下,因為樹上的節點都是資料庫查詢出來的,所以不能直接用addNodes()這個方法(否則一重新整理又恢復原樣了),而是要把這個節點及其某些屬性資料儲存到資料庫中,進一步的需求是:如果層級很多,挪過去的時候,要連帶他的所有父節點,子孫節點一起挪過去,加上他們的

從零開始學產品三個環境,開發測試和線上

本篇為【從零開始學產品】系列課第1章第4節 歡迎到公眾號選單欄,獲取產品經理課程更多資料     上節課我們說到了,Bug的生命週期,而只有在測試環境和線上環境發現的Bug,才會被稱之為Bug。 倒底什麼是測試環境,什麼是線上環境,

Docker $ Docker 資料管理

一.Docker資料卷簡介 1.在Docker內部及容器之間對資料的管理有兩種方式,一種是資料卷,另一種是掛載主機目錄。 (1)資料卷(Volumes):提供一個或多個容器使用的特殊目錄,它的特性有 在容器之間可共享,可重用 對資料卷的修改立即生效

EnjoyingSoft之Mule ESB開發教程控制訊息的流向-資料路由

目錄 1. 使用場景 2. 基於訊息頭的路由 2.1 使用JSON提交訂單的訊息 2.2 使用XML提交訂單的訊息 2.3 使用Choice元件判斷訂單格式

資料分析 離群點檢測

離群點(outlier)是指和其他觀測點偏離非常大的資料點,離群點是異常的資料點,但是不一定是錯誤的資料點。確定離群點對於資料分析會帶來不利的影響,比如,增大錯誤方差、影響預測和影響正態性。 從散點圖上可以直觀地看到離群點,離群點是孤立的一個數據點;從分佈上來看,離群點遠離資料集中其他資料點。  

資料加密 非對稱金鑰

非對稱金鑰(Asymmetric Keys)跟對稱金鑰相對,它使用一對金鑰(演算法),一個金鑰用於加密,另一個金鑰用於解密,加密的金鑰稱為私鑰(private key),解密的金鑰稱為公鑰(public key)。私鑰由一方安全保管,不能外洩,而公鑰則可以發給任何請求它的人。比如,你向銀行請求公鑰,銀行將公鑰

Elasticsearch 資料型別 ArrayNestedObject 的設計與應用

      在我的上一篇 《Elasticsearch 第七篇:父子結構mapping設計以及相關查詢》中,通過建立電影索引庫,將電影 film 與演員 actor 做了父子關係的聯結,並做了相關查詢, 但是實際上,父子關聯查詢並不是最推薦的設計方式。在實際應用中,通常要設計比較

ADF 轉換資料

對映資料流(Mapping Data Flow)的核心功能是轉換資料,資料流的結構分為Source、轉換和Sink(也就是Destination),這種結構非常類似於SSIS的資料流。 在資料流中,資料就像流水(stream)一樣,從上一個元件,流向下一個元件。元件之間有graph相連線,把各個元件連線為一個

數據預處理(二) - 異常值處理

ges 方向 分享 site 方式 得到 ros 聚類 測試 前言 數據中如果有某個值偏離該列其他值比較離譜,那麽就有可能是一個異常的值。在數據預處理中,自然需要把這個異常值檢測出來,然後剔除掉,或者光滑掉,或者其他各種方法進行處理。 需要註

Linux實戰RHEL7.3下Nginx虛擬主機配置實戰(基於別名)

虛擬主機 nginx個人筆記分享(在線閱讀):http://note.youdao.com/noteshare?id=05daf711c28922e50792c4b09cf63c58PDF版本下載http://down.51cto.com/data/2323313本文出自 “人才雞雞” 博客,請務必保留此出處

模塊

pytho 擴展名 提升 特殊屬性 基本 們的 imp rand 屬性 定義模塊 一、模塊基本概念 1、模塊是從邏輯上組織python代碼的形式 2、當代碼量變得相當大的時候,最好把代碼分成一些有 3、組織的代碼段

函數

hello name module 操作 創建 n) 由於 cti most 函數基本操作 一、函數基本概念1、函數是對程序邏輯進行結構化或過程化的一種編程方法 2、將整塊代碼巧妙地隔離成易於管理的小塊 3、把重復代碼放到函數中而不是進行大量的拷貝,這樣既能節省空間,

python基礎_5

執行過程 ini 間接 ray 復雜 func 時間 基於 time 本篇內容 協程函數 遞歸 二分法 import語句 from...import語句 模塊搜索路徑 包的導入 軟件開發規範 logging模塊的使用 一、 協程函數 1.定義 協程函數就是使用了y

Centos7上配置docker容器ssh登錄

方式 service col 客戶端連接 httpd 添加 遠程 初步 images 1.查看httpd容器是否運行2.啟動httpd容器3.默認情況下,我們只能在宿主機上通過如下方式連接容器說明:這是在宿主機連接容器直接有效的方法 我們能夠通過容器的IP地址連接容器呢?需

Django Restful Framework【】分頁視圖路由渲染器

framework 增刪改查 format conf apn register ali dmi elf 一、分頁 試問如果當數據量特別大的時候,你是怎麽解決分頁的? 方式a、記錄當前訪問頁數的數據id 方式b、最多顯示120頁等 方式c、只顯示上一頁,下一頁,不讓選擇頁

jmeter圖形監控擴展

col 服務 默認端口 PE load 分享圖片 bat serve 運行腳本 插件下載:http://jmeter-plugins.org/downloads/all/ 插件: 1.首先將jmeterPluging.jar包復制到jmeter的lib目錄下面的ext目

top命令free命令

src alt head 過濾 殺進程 pass -m cpu 內存 top命令(查看進程的狀態) 1.cache and buffer 2.cache:存放cpu經常調用的數據3.buffer:積攢硬盤上零散數據 free命令(使用內存的使用狀態) 1.free-m