1. 程式人生 > >數據備份、pymysql模塊

數據備份、pymysql模塊

數據庫 命令 輸入 lba AD itl 執行 %s res

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中
View Code

實現自動化備份

技術分享圖片
備份計劃:
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

五、表的導出和導入

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;

數據庫遷移

務必保證在相同版本之間遷移
# 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(‘登錄失敗‘)
技術分享圖片

具體的操作:

import pymysql
user = input(請輸入用戶名).strip()
pwd = input(請輸入密碼).strip()

# 連接數據庫
conn = pymysql.connect(host = 192.168.11.61, port = 3306 , user = root, password = zhaoyun, database = db4, charset = utf8)

# 上面第一個是進行連接你的 數據庫所在的ip地址 post是你的數據庫的端口號 user是你的數據庫的登陸名  password是你的數據庫賬號的密碼   database代指你要連接的具體的數據庫   charset代表字符編碼


# 下面需要創建一個遊標來進行你的數據的連接 通過這個遊標來進行連接

cursor = conn.cursor()

sql = "select * from t1 where name = %s and student_id = %s"%(user,pwd)  # 這個是查找你的數據庫中的t1表內的數據的信息

print(sql)
res = cursor.execute(sql)  # 執行sql 語句 並且返回sql查詢成功的紀錄數目
cursor .close() # 關閉你的遊標
conn.close()  # 關閉你的連接

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

二 execute()之sql註入

數據備份、pymysql模塊