mysqldump -uroot --opt pmp20 | mysql -h192.168.80.28 -uapp_db -p940430Dex -C pmp20html
mysqldump -uroot - -h132.151.41.137 -P3306 --opt pmp20 | mysql -h132.151.41.137 -uroot -P3306 -C pmp20_back
全庫備份-A
[root@mha2 backup]#mysqldump -uroot -p123456 --default-character-set=utf8 --single-transaction --extended-insert=false --hex-blob --master-data=2 --log-error=/tmp/test.err --routines --triggers --events --quick --flush-logs --all-databases > fulldump.sqlmysql
從全備份中只恢復report庫
[root@mha2 backup]# mysql -uroot -p123456 report --one-database <fulldump.sql
能夠看出這裏主要用到的參數是--one-database簡寫-o的參數,極大方便了咱們的恢復靈活性.linux
從全備份中只恢復t_order表
1)從備份查詢恢復表的表結構
[root@mha2 backup]# sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `t_order`/!d;q' fulldump.sql
DROP TABLE IF EXISTS `t_order`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t_order` (
`c_date` varchar(30) DEFAULT NULL,
`order_no` varchar(40) DEFAULT NULL,
`key_info` varchar(200) DEFAULT NULL,
`flag` varchar(30) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
2)從備份查詢出表的表數據
[root@mha2 backup]# grep 'INSERT INTO `t_order`' fulldump.sql >data.sql
總結nginx
好比恢復tb1表數據sql
sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `tb1`/!d;q' 20180723.sql > tb1.sqlshell
grep 'INSERT INTO `tb1`' 20180723.sql >> tb1.sql數據庫
或者
sed -n -e '/CREATE TABLE.*`tb1`/ ,/UNLOCK TABLES/p' 20180723.sql > tb_1.sql編程
可是這樣導出來的文件會有SET character_set_client因此導入時會報錯能夠忽略ubuntu
導入報錯能夠忽略vim
若是數據不大,也能夠將某個庫先恢復操做,在單獨將某個表備份,在恢復某個表
#! /bin/bash
mysqldump -uroot -p'password' databasename | gzip > /home/backup/database_`date +%Y%m%d%H%M`.sql.gz
備份方案:
備份主機:192.168.10.11
數據庫服務器:192.168.10.22
備分內容:對mysql服務器中的xxxx和yyyy庫進行遠程備份,天天凌晨2:30執行,每一個庫備份爲獨立的.sql文件,而後壓縮成.tar.gz的格式,文件名中嵌入執行備份的日期和時刻。
工做準備:
一、確保備份主機與數據庫服務器之間的網絡保持鏈接通暢,不能有網絡鏈路故障,防火牆等阻礙。
二、mysql服務必須容許備份主機遠程訪問,且受權用戶可以查詢xxxx和yyyy庫。
這兒能夠建立一個專用的數據庫備份帳戶"kanghui" 容許備份主機192.168.10.11鏈接到mysql數據庫,並受權對xxxx和yyyy庫的讀取權限,使用邏輯備份工具mysqldump的時候,須要對庫設置select和lock和tables權限
mysql > grant select,lock tables on xxxx.*to 'kanghui'@'192.168.10.11' identified by '123456'; mysql > grant select,lock tables on yyyy.*to 'kanghui'@'192.168.10.11' identified by '123456';
設置訪問權限後就在備份服務器上測試數據庫訪問,查詢受權等是否有效。
[root@localhost ~]#mysqldump -u root -p123456 -h 192.168.10.22 --databases xxxx > ceshi.sql [root@localhost ~]#ls -lh ceshi.sql
下面是一個mysql的備份腳本,根據本身的需求修改便可。
[root@localhost ~]#mkdir -p /opt/mysql_bak/ [root@localhost ~]#cd /opt/mysql_bak/ [root@localhost mysql_bak]# vim mysql_bak.sh #!/bin/bash #auto backup mysqldb #by authors kanghui 2016-06-12 #這是一個簡單化到MYSQL數據庫邏輯備份腳本 #1.定義數據庫連接,目標庫信息 MY_user="root" MY_pass="123456" MY_host="192.168.10.22" MY_conn="-u $MY_user -p$MY_pass -h $MY_host" MY_db1="xxxx" MY_db2="yyyy" #2.定義備份目錄,工具,時間,文件名 BF_dir="/opt/mysql_bak" BF_cmd="/usr/bin/mysqldump" BF_time="date +%Y%m%d-%H%M" name_1="$MY_db1-$BF_time" name_2="$MY_db2-$Bf_time" #3先導出爲.sql腳本,而後再進行壓縮(打包後刪除源文件) cd $BF_dir $BF_cmd $MY_conn --databases $MY_db1 > $name_1.sql $BF_cmd $MY_conn --databases $MY_db2 > $name_2.sql /bin/tar zcf $name_1.tar.gz $name_1.sql --remove &> /dev/null /bin/tar zcf $name_2.tar.gz $name_2.sql --remove &> /dev/null
設置權限並測試:
[root@localhost mysql_bak]#chmod +x mysql_bak.sh [root@localhost mysql_bak]#./mysql_bak.sh [root@localhost mysql_bak]#ls -lh /opt/mysql_bak/*.gz
最後把腳本加入帶計劃任務便可。
[root@localhost ~]#crontab -e 30 2 * * * /opt/mysql_bak/mysql_bak.sh
使用root用戶切換到根目錄
而後,使用下面的命令備份完整的系統:
tar cvpzf backup.tgz / --exclude=/proc --exclude=/lost+found --exclude=/backup.tgz --exclude=/mnt --exclude=/sys
或者
tar cvpzf /state/partition1/home/backup.tgz / --exclude=/proc --exclude=/lost+found --exclude=/backup.tgz --exclude=/mnt --exclude=/sys
恢復:
系統被毀壞,就能夠用備份好的tar包進行恢復。
在分區的根目錄下的backup.tgz文件
再一次確保你是根用戶以及備份文件在文件系統的根目錄。
要用的命令:
tar xvpfz backup.tgz -C /
若是你使用 bz2:
tar xvpfj backup.tar.bz2 -C /
警告:這會把你分區裏全部文件替換成壓縮文檔裏的文件!
確保在你作其餘任何事情以前,從新建立你剔除的目錄:
mkdir proc
mkdir lost+found
mkdir mnt
mkdir sys
Linux系統全部的數據都以文件的形式存在,因此備份就是直接拷貝文件;硬盤分區也被當成文件,因此能夠直接克隆硬盤數據。
Linux系統自帶不少實用工具,好比tar、dd、rsync等,備份還原系統不須要購買或下載第三方軟件。
Linux系統在運行時其硬盤上的文件能夠直接被覆蓋,因此還原系統的時候不須要另外的引導盤。(固然,系統徹底掛掉到沒法啓動這種狀況仍是須要另外的引導盤的。)
備份Linux系統的策略有不少,好比使用dd命令直接克隆硬盤分區:
sudo dd if=/dev/sda1 of=/dev/sdb1
或者,使用tar將硬盤上的文件打包:
tar cvpzf backup.tgz --exclude=/proc --exclude=/mnt --exclude=/sys --exclude=/backup.tgz /
還原系統的命令是:
dd if=/dev/sdb1 of=/dev/sda1
或
tar xvpfz backup.tgz -C /
備份策略是使用rsync命令將硬盤上的全部文件(固然要排除/proc和/sys目錄下的內容)複製到U盤上。首先使用df -lh
命令查看一下我電腦的系統佔多大空間,
#df -h
#mount
碰到超過4G的巨型文件怎麼辦?so,先umount
它,而後使用mkfs.ext3
爲它從新創建一個文件系統。
#umount /dev/sdb1
#mkfs.ext3 /dev/sdb1
再把U盤mount
起來,掛載的路徑爲/media/youxia/usb
#mkdir /medida/youxia/usb
#mount /dev/sdb1/ /media/youxi/usb
開始備份了,我備份的命令是:
rsync -Pa / /media/youxia/usb/backup_20141216 --exclude=/media/* --exclude=/sys/* --exclude=/proc/* --exclude=/mnt/* --exclude=/tmp/*
YUM安裝的MySQL ,數據存在/var/lib/mysql目錄
源碼安裝的,數據存在目錄
mysqldump經常使用參數
-A
(--all-databases)
全庫備份
–B
增長建庫(create)及「use庫」的語句,可接多個庫名,同時備份
多個庫***** -B 庫1 庫2。
備份帶有create、use等語句。
-d
僅表結構。
-t
僅數據。
–R
(--routines)
備份存儲過程和函數數據
(--triggers)
備份觸發器數據
-F
(--flush-logs)
刷新binlog日誌(回顧binlog)
自動在備份時滾動binlog
--routines
減小無用數據輸出
(調試)
經常使用備份腳本
#!/bin/bash #單庫備份目錄 Single_Database="/usr/local/mysql/backup/Single_Database/" #全庫備份目錄 Full_Database="/usr/local/mysql/backup/Full_Database/" #日誌存放目錄 LOG="/usr/local/mysql/backup/backup.log" #示例單庫 Sin_Dat=mysql_test #登陸數據庫的用戶 USER="root" #登陸數據庫的密碼 PASSWD="123456" #數據庫的IP HOST="localhost" #數據庫的端口 PORT="3306" #當前時間 time=`date +"%Y-%m-%d %H:%M:%S"` #備份單庫mysql_test echo -e "\033[34m ***********Begin backup Single Database***********\033[0m" #顯示進度條 b='' i=0 while [ $i -le 100 ] do printf "Please wait...[%-50s]%d%%\r" $b $i sleep 0.1 i=`expr 2 + $i` b=#$b done #若是單庫目錄不存在則建立並進入到目錄 [ ! -d $Single_Database ] && mkdir -p $Single_Database || cd "$Single_Database" >/dev/null 2>&1 #使用MySQL自帶的mysqldump進行備份 mysqldump -u$USER -p$PASSWD -h$HOST -P$PORT -F -R --triggers -B $Sin_Dat --lock-all-tables >$Single_Database$Sin_Dat"_"$time.sql #打印日誌存放地址 echo -e "\033[35m##You can query log in $LOG##\033[0m" #備份成功與否都打印相應信息 if [ $? == 0 ];then echo -e "\033[35m##$Sin_Dat backup successful in $Single_Database##\033[0m" else echo -e "\033[35m##$Sin_Dat backup failed in $Single_Database##\033[0m" fi #休息10秒 sleep 10 #換行 echo #備份所有數據庫 echo -e "\033[34m ***********Begin backup Full databases***********\033[0m" #顯示進度條 b='' i=0 while [ $i -le 100 ] do printf "Please wait...[%-50s]%d%%\r" $b $i sleep 0.1 i=`expr 2 + $i` b=#$b done #若是全庫目錄不存在則建立並進入到目錄 [ ! -d $Full_Database ] && mkdir -p $Full_Database || cd "$Full_Database" >/dev/null 2>&1 #使用MySQL自帶的mysqldump進行備份 mysqldump -u$USER -p$PASSWD -h$HOST -P$PORT -A -B -R -F --lock-all-tables >$Full_Database/Full_$time.sql #打印日誌存放地址 echo -e "\033[35m##You can query log in $LOG##\033[0m" #備份成功與否都打印相應信息 if [[ $? == 0 ]];then echo -e "\033[35m##Full database backup successful in $Full_Database##\033[0m" else echo -e "\033[35m##Full database backup failed in $Full_Database##\033[0m" fi
腳本演示
(1)備份MYSQL數據庫,備份的工具的選擇;
數據小於100G, 使用全備 ,基於mysqldump工具有份,備份會鎖表;
數據大於100G, 使用增量備份 ,基於Xtrabackup工具有份,Innodb引擎;
(2)備份MYSQL數據庫,備份的策略的選擇;
每周進行全備,或者每週1-6增量備份週日全備;通常凌晨1點-7點結束;
(3)備份MYSQL數據庫,備份的路徑或者目錄、服務器;
/data/backup/'date+%F' ,當天的日期 ,或者備份到遠程服務器、FTP服務器;
(4)備份MYSQL數據庫,全庫備份仍是單庫備份;
備份單個數據庫,或者備份全部的數據庫,根據需求選擇;
(5)備份MYSQL數據庫 ,備份的用戶名、密碼;
設置專門備份數據庫用戶名和密碼,跟生產環境其餘用戶名和密碼分開,提升安全性;
(6)備份MYSQL數據庫,保存的空間,是否認時清除的舊的數據;
定時刪除舊的數據,基於find工具查找30天之前、半年以前的數據,rm掉;
SHELL自動備份MYSQL數據庫(思路)
1)服務器必須存在MYSQL服務;
2)明確備份MYSQL的工具;
3)基於MYSQLdump優缺點;
4)備份的命令及語法;
5)備份的數據庫,目的地;
6)備份的策略,增量、全備,備份的時間;
數據量小於100G,天天凌晨2點,作完整備份!
數據量大於100G,每週1-6進行增量備份(增長、修改),每週日進行完整備份;
7)定時刪除過時的數據,四劍客find;
#mysqldump -uroot -p --all-databases #表示備份全部的數據庫
#mysqldump -uroot -p test #表示備份test數據庫
#mysqldump -uroot -p zabbix > /data/backup/20190623/zabbix.sql #備份zabbix數據庫到/data/backup/20190623/zabbix.sql 文件中。
>grant select on *.* to backup@'localhost' identified by "123456"; #對select進行受權。
報錯緣由 :沒有受權,僅僅對select進行受權,鎖不了表,就沒法備份。
>grant all on *.* to backup@'localhost' identified by "123456"; #對全部進行受權。
MySQLdump工具 :
一般小於100G的MySQL數據庫可使用默認Mysqldump備份工具進行備份,若是超過100G的數據,因爲Mysqldump備份方式是採用的邏輯備份,最大的缺陷是備份
數據庫中建立備份的用戶並受權:
grant all on *.* to backup@'localhost' identified by "1qaz@WSX";
flush privileges;
查看mysqldump工具路徑:
whereis mysqldump
which mysqldump
MYSQL備份腳本內容:(第一個版本)
#!/bin/bash #2017年7月20日10:33:10 #by author www.jfedu.net #auto backup mysql DB ############## MYSQL_CMD="/usr/bin/mysqldump" MYSQL_USR="backup" MYSQL_PWD="1qaz@WSX" MYSQL_DIR="/data/backup/$(date +%Y%m%d)" MYSQL_DB="ultrax"
#Judge user UID for root if [ $UID -ne 0 ];then echo -e "\033[32mYou must to be root user exec Shell.Please exit.\033[0m" exit 0 fi #Create MYSQL Backup DIR Dest if [ ! -d $MYSQL_DIR ];then mkdir -p $MYSQL_DIR else echo -e "\033[32mThe $MYSQL_DIR already exists.\033[0m" fi
#mysqldump backup mysql databases $MYSQL_CMD -u$MYSQL_USR -p$MYSQL_PWD $MYSQL_DB >$MYSQL_DIR/${MYSQL_DB}.sql if [ $? -eq 0 ];then
echo -e "\033[32mThe ${MYSQL_DIR}/${MYSQL_DB}.sql Backup success.\033[0m" echo "----------------------" ls -l ${MYSQL_DIR}/${MYSQL_DB}.sql else echo -e "\033[32mThe $MYSQL_DB Backup Failed,Please check. \033[0m" fi |
MYSQL備份腳本內容:(第二個版本)
#!/bin/bash #2017年7月20日10:33:10 #by author www.jfedu.net #auto backup mysql DB ############## MYSQL_CMD="/usr/bin/mysqldump" MYSQL_USR="backup" MYSQL_PWD="1qaz@WSX" MYSQL_BAK="/data/backup/$(date +%Y%m%d)" MYSQL_DB="$1" if [ $# -eq 0 ];then echo -e "\033[32m-------------------\033[0m" echo -e "\033[32mUsage:{sh $0 discuz|ultrax|jfedu|all}\033[0m" exit 0 fi #Judge user UID for root if [ $UID -ne 0 ];then echo -e "\033[32mYou must to be root user exec Shell.Please exit.\033[0m" exit 0 fi #Create MYSQL Backup BAK Dest if [ ! -d $MYSQL_BAK ];then mkdir -p $MYSQL_BAK else echo -e "\033[32mThe $MYSQL_BAK already exists.\033[0m" fi #backup mysql all databases if [ $MYSQL_DB == "all" ];then $MYSQL_CMD -u$MYSQL_USR -p$MYSQL_PWD --all-databases >$MYSQL_BAK/mysql_db_all.sql echo -e "\033[32mThe Mysql ALL DB Backup success.\n$MYSQL_BAK/mysql_db_all.sql\033[0m" exit 0 fi #mysqldump backup mysql databases $MYSQL_CMD -u$MYSQL_USR -p$MYSQL_PWD $MYSQL_DB >$MYSQL_BAK/${MYSQL_DB}.sql if [ $? -eq 0 ];then echo -e "\033[32mThe ${MYSQL_BAK}/${MYSQL_DB}.sql Backup success.\033[0m" echo "----------------------" ls -l ${MYSQL_BAK}/${MYSQL_DB}.sql else echo -e "\033[32mThe $MYSQL_DB Backup Failed,Please check. \033[0m" fi #judge mysql backup files for modify time; #find $MYSQL_BAK/../ -mtime +30 -exec rm -rf {} \; find `echo $MYSQL_BAK|awk -F/ '{print "/"$2"/"$3"/"}'` -mtime +30 -exec rm -rf {} \; |
刪除30天之前的文件
#find . -mtime +30 -name "*.sql" -type f -exec rm -rf {} \;
>source /data/sh/20190526/1.sql #建立一個新的數據庫
定時任務(crontab -e);
mysql備份實例,自動備份mysql,並刪除30天前的備份文件
設計一個shell程序,在每個月第一天備份並壓縮/etc目錄的全部內容,存放在/root/bak目錄裏,且文件名爲以下形式yymmdd_etc,yy爲年,mm爲月,dd爲日。Shell程序fileback存放在/usr/bin目錄下。
參考答案: (1)編寫shell程序fileback: #!/bin/sh DIRNAME=`ls /root | grep bak` if [ -z "$DIRNAME" ] ; then mkdir /root/bak cd /root/bak fi YY=`date +%y` MM=`date +%m` DD=`date +%d` BACKETC=$YY$MM$DD_etc.tar.gz tar zcvf $BACKETC /etc echo "fileback finished!" (2)編寫任務定時器: echo "0 0 1 * * /bin/sh /usr/bin/fileback" >; /root/etcbakcron crontab /root/etcbakcron 或使用crontab -e 命令添加定時任務: 0 1 * * * /bin/sh /usr/bin/fileback
自動安裝Nginx腳本,採用case方式,選擇方式,也能夠根據實際需求改爲本身想要的腳本
#!/bin/sh ###nginx install shell ###wugk 2012-07-14 ###PATH DEFINE SOFT_PATH=/data/soft/ NGINX_FILE=nginx-1.2.0.tar.gz DOWN_PATH=http://nginx.org/download/ if[ $UID -ne 0 ];then echo This script must use administrator or root user ,please exit! sleep 2 exit 0 fi if[ ! -d $SOFT_PATH ];then mkdir -p $SOFT_PATH fi download () { cd $SOFT_PATH ;wget $DOWN_PATH/$NGINX_FILE } install () { yum install pcre-devel -y cd $SOFT_PATH ;tar xzf $NGINX_FILE ;cd nginx-1.2.0/ &&./configure –prefix=/usr/local/nginx/ –with-http_stub_status_module –with-http_ssl_module [ $? -eq 0 ]&&make &&make install } start () { lsof -i :80[ $? -ne 0 ]&&/usr/local/nginx/sbin/nginx } stop () { ps -ef |grep nginx |grep -v grep |awk ‘{print $2}’|xargs kill -9 } exit () { echo $? ;exit } ###case menu ##### case $1 in download ) download ;; install ) install ;; start ) start ;; stop ) stop ;; * ) echo 「USAGE:$0 {download or install or start or stop}」 exit esac
批量解壓tar腳本,批量解壓zip而且創建當前目錄。
#!/bin/sh PATH1=/tmp/images PATH2=/usr/www/images for i in `ls ${PATH1}/*` do tar xvf $i -C $PATH2 done
這個腳本是針對全部tar文件在一個目錄,可是實際狀況中,有可能在下級或者更深的目錄,咱們可使用find查找
#!/bin/sh PATH1=/tmp/images PATH2=/usr/www/images for i in `find $PATH1 -name 」*.tar」 ` do tar xvf $i -C $PATH2 done
如何是zip文件,例如123189.zip 132342.zip 等等批量文件,默認unzip直接解壓不帶自身目錄,意思是解壓123189.zip完當前目錄就是圖片,不能建立123189目錄下並解壓,能夠用shell腳本實現
#!/bin/sh PATH1=/tmp/images PATH2=/usr/www/images cd $PATH1 for i in `find . -name 」*.zip」|awk -F. {print $2} ` do mkdir -p PATH2$i unzip -o .$i.zip -d PATH2$i done
上傳文件大多數用的是ftp,可是用ftp有一點很差,就是本地和遠程的目錄要對應,這樣就要在多個目錄下去切換,這樣挺麻煩的,若是不注意的話,頗有可能傳錯。因此想了個辦法利用scp來批量上傳文件或者目錄。
一,scp上傳不要輸入密碼
若是要用scp來上傳文件,第一步就要去掉scp上傳時要輸入密碼。要否則就沒辦法批量上傳了。具體請參考:ssh 不用輸入密碼
二,ssh批量上傳腳本
1,要上傳的文件列表放到一個test文件中
root@ubuntu:/home/zhangy# cat test /home/zhangy/test/aaa /home/zhangy/test/nginx.conf /home/zhangy/test/test.sql /home/zhangy/test/pa.txt /home/zhangy/test/password
上面就要上傳的文件。
2,批量上傳的腳本
vim file_upload.sh
#!/bin/sh DATE=`date +%Y_%m_%d_%H` if [ $1 ] then for file in $(sed '/^$/d' $1) //去掉空行 do if [ -f $file ] //普通文件 then res=`scp $file $2:$file` //上傳文件 if [ -z $res ] //上傳成功 then echo $file >> ${DATE}_upload.log //上傳成功的日誌 fi elif [ -d $file ] //目錄 then res=`scp -r $file $2:$file` if [ -z $res ] then echo $file >> ${DATE}_upload.log fi fi done else echo "no file" >> ${DATE}_error.log fi
上傳成功後,返回的是一個空行,上傳不成功,什麼都不返回
3,上傳的格式
./file_upload.sh test 192.168.1.13
test是上傳列表文件,192.168.1.13文件要傳到的地方。
常見問題 :
一、時間不一樣步
#date
#ntpdate pool.ntp.org
二、沒法ping通外網,更改DNS設置vi /etc/resolv.conf ,添加8.8.8.8.,再次ping外網