一账胧、直連數(shù)據(jù)庫備份
1比藻、使用navicat進(jìn)行定時(shí)備份
這種備份方法詳見http://tech.huweishen.com/gongju/1182.html赔硫,該方法在windows和centos中都可以實(shí)現(xiàn)伞梯,直接連接數(shù)據(jù)庫進(jìn)行定時(shí)備份蛛蒙。
2衣式、在centos下使用腳本文件進(jìn)行備份
以下腳本測試可以實(shí)現(xiàn)備份寸士,參考http://www.jb51.net/article/84514.htm實(shí)現(xiàn)
!/bin/sh
BACKUP_BIN=/usr/bin/mysqlbinlog
LOCAL_BACKUP_DIR=/opt/mysql_log_data/mysqllog
BACKUP_LOG=/opt/mysql_log_data/baklog
REMOTE_HOST=...
REMOTE_PORT=端口號
REMOTE_USER=用戶名
REMOTE_PASS=用戶密碼
FIRST_BINLOG=logbin.000001
time to wait before reconnecting after failure
SLEEP_SECONDS=10
create local_backup_dir if necessary
mkdir -p ${LOCAL_BACKUP_DIR}
cd ${LOCAL_BACKUP_DIR}
運(yùn)行while循環(huán),連接斷開后等待指定時(shí)間碴卧,重新連接
while :
do
if [ ls -A "${LOCAL_BACKUP_DIR}" |wc -l
-eq 0 ];then
LAST_FILE=${FIRST_BINLOG}
else
LAST_FILE=ls -l ${LOCAL_BACKUP_DIR} | grep -v backuplog |tail -n 1 |awk '{print $9}'
fi
${BACKUP_BIN} --raw --read-from-remote-server --stop-never --host=${REMOTE_HOST} --port=${REMOTE_PORT} --user=${REMOTE_USER} --password=${REMOTE_PASS} ${LAST_FILE}
echo "date +"%Y/%m/%d %H:%M:%S"
mysqlbinlog停止弱卡,返回代碼:$?" | tee -a ${BACKUP_LOG}
echo "${SLEEP_SECONDS}秒后再次連接并繼續(xù)備份" | tee -a ${BACKUP_LOG}
sleep ${SLEEP_SECONDS}
done
3、缺點(diǎn):
個(gè)人認(rèn)為這種方法最顯著的缺點(diǎn)就是:數(shù)據(jù)庫直接暴露在公網(wǎng)環(huán)境中螟深,實(shí)際的生產(chǎn)環(huán)境是不允許的谐宙。
二、間接拷貝備份文件(詳細(xì)介紹這種思路)
1界弧、開啟mysql的binlog日志文件
修改mysql的my.cnf(Linux)或者my.ini(Windows)文件凡蜻,添加如下內(nèi)容
[mysqld]
skip-grant-tables
lower_case_table_names = 1 #大小寫不敏感
log-bin = logbin.log #log-bin若不顯示制定存儲目錄,則默認(rèn)存儲在mysql的data目錄下
log-bin-index = logindex
expire_logs_days = 7#日志保留天數(shù)為七天
server-id=1 #在設(shè)置log-bin的同時(shí)需要設(shè)置server-id,否則會報(bào)錯(cuò)
binlog_format=row #row基于行的存儲,啟動后會產(chǎn)生mysql-bin.*這樣的文件,每啟動一次就會增加一個(gè)
重啟mysql--systemctl restart mysqld
進(jìn)入mysql中查看日志文件是否開啟-show variables like '%log_bin%';
彈出以下內(nèi)容:
+---------------------------------+-------------------------------+
| Variable_name | Value |
+---------------------------------+-------------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/logbin |
| log_bin_index | /var/lib/mysql/logindex.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+-------------------------------+
log_bin_basename和log_bin_index屬性是可以修改垢箕,上述是默認(rèn)位置
修改只需在/etc/my.cnf中l(wèi)og-bin = logbin.log 和log-bin-index = logindex加入絕對路徑即可划栓;
2、做一次全量備份
mysqldump -h IP地址 -P端口號 -u用戶 -p密碼 --databases 數(shù)據(jù)庫名稱> /opt/mysql_log_data/date +%Y%m%d
.sql
3条获、定時(shí)做增量備份
!/bin/bash
export LANG=en_US.UTF-8
BakDir=本地路勁
BinDir=/var/lib/mysql
LogFile=logbin文件的存放路徑忠荞,具體看你設(shè)置為多少
BinFile=logindex.logindex路徑
mysqladmin -u用戶名-p密碼 flush-logs
這個(gè)是用于產(chǎn)生新的mysql-bin.00000*文件,必須使用mysqladmin
Counter=wc -l $BinFile |awk '{print $1}'
NextNum=0
這個(gè)for循環(huán)用于比對$Counter,$NextNum這兩個(gè)值來確定文件是不是存在或最新的。
for file in cat $BinFile
do
base=basename $file
#basename用于截取mysql-bin.00000*文件名帅掘,去掉./mysql-bin.000005前面的./
NextNum=expr $NextNum + 1
if [ $NextNum -eq $Counter ]
then
echo $base skip! >> $LogFile
else
dest=$BakDir/$base
if(test -e $dest)
#test -e用于檢測目標(biāo)文件是否存在委煤,存在就寫exist!到$LogFile去。
then
echo $base exist! >> $LogFile
else
cp $BinDir/$base $BakDir
echo $base copying >> $LogFile
fi
fi
done
echo date +"%Y年%m月%d日 %H:%M:%S"
Bakup succussful! >> $LogFile
開啟定時(shí)器vim /etc/crontab
加入腳本文件的執(zhí)行
00 00 * * * 腳本文件路徑 >/dev/null 2>&1
定時(shí)器的設(shè)置詳見https://www.cnblogs.com/wt645631686/p/6868672.html
開啟定時(shí)器crontab /etc/crontab
查看定時(shí)器 crontab -l
4修档、安裝expect ---yum -install expect
5碧绞、寫scp拷貝腳本(需要首先安裝ssh服務(wù),并配置端口)
!/usr/bin/expect
set timeout 100
set password "密碼"
spawn scp -r -P 端口root@IP地址:目標(biāo)文件夾/. 本地文件夾
expect "終端提示要輸入密碼的前面內(nèi)容"
send "$password\n"
interact
6吱窝、寫定時(shí)執(zhí)行scp拷貝腳本(因?yàn)閟ource sh執(zhí)行出錯(cuò))
!/bin/sh
cd scp存放的絕對路徑
./腳本名稱
加入定時(shí)器
完成以上6步就實(shí)現(xiàn)了遠(yuǎn)程數(shù)據(jù)庫的備份讥邻,這種基于ssh的備份是相對安全的
歡迎批評指正