數據備份、pymysql模塊

 

 

 

 

閱讀目錄html

  • 一 IDE工具介紹
  • 二 MySQL數據備份
  • 三 pymysql模塊

一 IDE工具介紹

生產環境仍是推薦使用mysql命令行,但爲了方便咱們測試,可使用IDE工具mysql

下載連接:https://pan.baidu.com/s/1bpo5mqjsql

掌握:
#1. 測試+連接數據庫
#2. 新建庫
#3. 新建表,新增字段+類型+約束
#4. 設計表:外鍵
#5. 新建查詢
#6. 備份庫/表

#注意:
批量加註釋:ctrl+?鍵
批量去註釋:ctrl+shift+?鍵

二 MySQL數據備份

知識儲備:mysql binlog(二進制日誌)數據庫

binlog記錄了全部的DDL和DML(除了查詢語句)語句,以事件形式記錄,還包含語句所執行的消耗時間,MySQL的二進制日誌是事務安全型的。vim

#1. 物理備份:直接複製數據庫文件,適用於大型數據庫環境。但不能回覆到異構系統中,如Windows
#2. 邏輯備份:備份的是建表、建庫、插入等操做所執行的SQL語句,適用於中小型數據庫,效率相對較低。
#3. 導出表:將表導入到文本文件中。

一、使用mysqldump實現邏輯備份windows

# 語法: (windows下要用管理員身份運行)
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 db3 < /backup/db3.sql

#方法二:
mysql> use db1;
mysql> SET SQL_LOG_BIN=0;   設爲0後,在Master數據庫上執行的語句都不記錄binlog
mysql> source /root/db1.sql

#注:若是備份/恢復單個庫時,能夠修改sql文件
DROP database if exists school;
create database school;
use school; 

三、備份/恢復案例bash

#數據庫備份/恢復實驗一:數據庫損壞
備份:
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
View Code

五、表的導出和導入ide

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

六、數據庫遷移

務必保證在相同版本之間遷移
# mysqldump -h 源IP -uroot -p123 --databases db1 | mysql -h 目標IP -uroot -p456

 

三 pymysql模塊

 

一 連接、執行sql、關閉(遊標)

 

import pymysql

user = input('username>>:').strip()
password = input('password>>:').strip()

# 連接
conn = pymysql.connect(host='localhost', user='root', password='', database='db5', charset='utf8')

# 遊標
cursor=conn.cursor() #執行完畢返回的結果集默認以元組顯示
#cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)


# 執行sql語句
sql = 'SELECT * FROM userinfo WHERE user="%s" and pwd="%s"' % (user, password)#注意%s須要加引號
print(sql)

res = cursor.execute(sql)#執行sql語句,返回sql查詢成功的記錄數目

print(res)

if res:
    print('登錄成功')
else:
    print('登錄失敗')

 

二 execute() 之sql注入

經過屬於語句參數來改變sql語句原本的含義來達到其餘目的的,稱之爲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)
'''
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
相關文章
相關標籤/搜索