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外网