mysql六:数据备份、pymysql模块
生活随笔
收集整理的這篇文章主要介紹了
mysql六:数据备份、pymysql模块
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
閱讀目錄
一 MySQL數據備份
二 pymysql模塊
一 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中四、實現自動化備份
備份計劃: 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=123if [ ! -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 * * * /mysql_back.sql五、表的導出和導入
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'; #可能會報錯 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()四 查: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) '''五 獲取插入的最后一條數據的自增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()?
?
?
?
?
?
?
?
MySQL系列
第一篇:初識數據庫
第二篇:庫操作
第三篇:表操作
第四篇:數據操作
第五篇:索引原理與慢查詢優化
第六篇:數據備份、pymysql模塊
第七篇:視圖、觸發器、事務、存儲過程、函數
第八篇:ORM框架SQLAlchemy
轉載于:https://www.cnblogs.com/shangdelu/p/8478486.html
總結
以上是生活随笔為你收集整理的mysql六:数据备份、pymysql模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 迅为IMX8MM开发板Linux系统修改
- 下一篇: HALCON示例程序particle.h