博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysqldump来备份MYSQL数据库(脚本)
阅读量:2434 次
发布时间:2019-05-10

本文共 5840 字,大约阅读时间需要 19 分钟。

转载地址:
改良版本mysqldump来备份MYSQL数据库 我的备份脚本都是在凌晨执行的,经常在慢查询日志里面看到这样的信息:select * from table1;

之前一直很纳闷,最后才了解到原来是MYSQLDUMP搞的鬼。 因为MYSQLDUMP会为整个库来加一个全局锁定。

如果单纯用MYSQLDUMP进行全库备份会造成以下三个方面的影响。

1、服务器CPU严重阻塞。

2、磁盘I/O直线增加。

3、所有的查询都成了慢查询。 我现在的网站数据库大概是5个G左右,而且每天都有增大。

表结构是MYISAM,INNODB,MEMORY三者混合。

所以单纯用HOTCOPY工具恐怕有点困难。所以我今天简单变了一下我上次写的关于用OUTFILE来备份MYSQL的脚本。

可以解决上面说的三个缺点。 
1、备份脚本内容
 

[david_yeung@localhost ~]$ cat fast_backup 

#!/bin/sh # # Created by david yeung. # # 20080707. # # Backup mysql's full data. # DBNAME=$1

BACKUPDIR=/home/david_yeung/backup_new

USERNAME=backup_user

PASSWD=123456

TARNAME="$BACKUPDIR"/backup"$1"`date '+%Y%m%d'`

# Add your own database name here.

case "$1" in

my_site);;

*) exit;; 

esac

# Get all the tables' name.

NUM=`/usr/local/mysql/bin/mysql -u$USERNAME -p$PASSWD -s -vv -e "show tables" -D $DBNAME|wc -l`

HEADNUM=`expr ${NUM} - 3`

TAILNUM=`expr ${NUM} - 7`

ARR1=`/usr/local/mysql/bin/mysql -u$USERNAME -p$PASSWD -s -vv -e "show tables" -D $DBNAME| head -n"$HEADNUM" | tail -n "$TAILNUM"`

ARR2=($ARR1) i=0

while [ "$i" -lt "${#ARR2[@]}" ]

do

tmpFileName=${ARR2[$i]}

# The real dump process.

/usr/local/mysql/bin/mysqldump -u$USERNAME -p"$PASSWD" "$DBNAME" "$tmpFileName" >> "$TARNAME" 

let "i++"

done 

2、因为我们一直用存储过程,所以得单独备份出来。
 

[david_yeung@localhost ~]$ cat fast_sp

#!/bin/sh

# Created by david yeung 20080122.

#

# Backup site's routine.

TARNAME=/home/david_yeung/backup_new/spBackup"$1"`date '+%Y%m%d'`

/usr/local/mysql/bin/mysqldump -ubackup_user -p123456 -n -t -d -R my_site > "$TARNAME" 
3、丢到计划任务里面去,就不管了。
 

[root@localhost backup_new]# crontab -l

0 01 * * * /home/david_yeung/fast_backup my_site

0 0 * * 5 /home/david_yeung/fast_sp 每天凌晨1点备份数据,每个周五凌晨备份存储过程。


4、因为有人说碰到要恢复单表的数据,所以把备份单表脚本也贴上。


#!/bin/sh


#


# Created by david yeung.


#


# 20080707.


#


# Backup mysql's full data.


#


DBNAME=$1

USERNAME=backup_user

PASSWD=123456

PREFIX=/home/david_yeung/backup_new/

DIRNAME=$PREFIX`date '+%Y%m%d'`

echo $TARNAME

# Add your own database name here.

case "$1" in

t_girl);;

*) exit;;

esac

if [ ! -d "$DIRNAME" ]

then

mkdir "$DIRNAME"

fi

# Get all the tables' name.

NUM=`/usr/local/mysql/bin/mysql -u$USERNAME -p$PASSWD -S/tmp/mysql50.sock -s -vv -e "show tables" -D $DBNAME|wc -l`

HEADNUM=`expr ${NUM} - 3`

TAILNUM=`expr ${NUM} - 7`

ARR1=`/usr/local/mysql/bin/mysql -u$USERNAME -p$PASSWD -S/tmp/mysql50.sock -s -vv -e "show tables" -D $DBNAME| head -n"$HEADNUM" | tail -n "$TAILNUM"`

ARR2=($ARR1)


i=0

while [ "$i" -lt "${#ARR2[@]}" ]

do

tmpFileName=${ARR2[$i]}

# The real dump process.

/usr/local/mysql/bin/mysqldump -u$USERNAME -p"$PASSWD" -S/tmp/mysql50.sock "$DBNAME" "$tmpFileName" > "$DIRNAME"/"$tmpFileName"

let "i++"

done -------------------------------------------------------------------------------- 使用mysqldump定时备份数据库的脚本 2009-02-02 10:26 
2.1、备份脚本
使用脚本每天定期执行数据库备份操作,对每个使用mysql数据库的人来说都很有必要,这样的脚本网上有很多,这里摘抄一个朋友的脚本 dbbackup:

这个脚本每天最多只执行一次,而且只保留最近五天的备份在服务器上。


dbbackup代码: 

#!/bin/bash 

#This is a ShellScript. For Auto DB Backup 

#Powered by aspbiz 

#2004-09 


#Setting 

#设置数据库名,数据库登录名,密码,备份路径,日志路径,数据文件位置,以及备份方式

#默认情况下备份方式是tar,还可以是mysqldump,mysqldotcopy 

#默认情况下,用root(空)登录mysql数据库,备份至/root/dbxxxxx.tgz 

DBName=mysql 

DBUser=root 

DBPasswd= 

BackupPath=/root/ 

LogFile=/root/db.log 

DBPath=/var/lib/mysql/ 

#BackupMethod=mysqldump 

#BackupMethod=mysqlhotcopy 

#BackupMethod=tar 

#Setting End 



NewFile="$BackupPath"db$(date +%y%m%d).tgz 

DumpFile="$BackupPath"db$(date +%y%m%d) 

OldFile="$BackupPath"db$(date +%y%m%d --date='5 days ago').tgz 


echo "-------------------------------------------" >> $LogFile 

echo $(date +"%y-%m-%d %H:%M:%S") >> $LogFile 

echo "--------------------------" >> $LogFile 

#Delete Old File 

if [ -f $OldFile ] 

then 

rm -f $OldFile >> $LogFile 2>&1 

echo "[$OldFile]Delete Old File Success!" >> $LogFile 

else 

echo "[$OldFile]No Old Backup File!" >> $LogFile 

fi 


if [ -f $NewFile ] 

then 

echo "[$NewFile]The Backup File is exists,Can't Backup!" >> $LogFile 

else 

case $BackupMethod in 

mysqldump) 

     if [ -z $DBPasswd ] 

     then 

        mysqldump -u $DBUser --opt $DBName > $DumpFile 

     else 

        mysqldump -u $DBUser -p$DBPasswd --opt $DBName > $DumpFile 

     fi 

     tar czvf $NewFile $DumpFile >> $LogFile 2>&1 

     echo "[$NewFile]Backup Success!" >> $LogFile 

     rm -rf $DumpFile 

     ;; 

mysqlhotcopy) 

     rm -rf $DumpFile 

     mkdir $DumpFile 

     if [ -z $DBPasswd ] 

     then 

       mysqlhotcopy -u $DBUser $DBName $DumpFile >> $LogFile 2>&1 

     else 

        mysqlhotcopy -u $DBUser -p $DBPasswd $DBName $DumpFile >>$LogFile 2>&1 

     fi 

     tar czvf $NewFile $DumpFile >> $LogFile 2>&1 

     echo "[$NewFile]Backup Success!" >> $LogFile 

     rm -rf $DumpFile 

     ;; 

*) 

     /etc/init.d/mysqld stop >/dev/null 2>&1 

     tar czvf $NewFile $DBPath$DBName >> $LogFile 2>&1 

     /etc/init.d/mysqld start >/dev/null 2>&1 

     echo "[$NewFile]Backup Success!" >> $LogFile 

     ;; 

esac 

fi 


echo "-------------------------------------------" >> $LogFile

2.2、放入crontab定期执行dbbackup
假定dbbackup在/root目录下。我们通过使用crontab命令,设置每天0点10分执行/root/dbbakup脚本。
1、 使用crontab –e 编辑crontab
2、 在crontab中加入:
#back for mysql database
10 0 * * * /root/dbbackup

新增:
1)、把远程mysql服务器上的选定表的指定数据导入到本地的文本文件中: 
[hello@localhost hello]$ mysqldump -hhostname -uusername -p -w "last>'2007-01-01'" dbname tablename > ./filename 
Enter password: 
2)、把远程mysql服务器上的选定数据库的全部数据导入到本地的文本文件中: 
[hello@localhost hello]$ mysqldump -hhostname -uusername -p dbname > ./filename 
Enter password:

3)、把远程mysql服务器上的选定表的指定数据导入到服务器的文本文件中(所以在本地不能操作如下): 

mysql> use dbname; 
mysql> select fieldname into outfile '/home/hello/a.txt' from tablename where last>"2007-1-1"; 
ERROR 1045: Access denied for user: 'hello@%' (Using password: YES) 
mysql>

4)、把远程mysql服务器上的选定表的指定数据导入到本地的文本文件中:

[hello@localhost hello]$ mysql -e "select fieldname from tablename where last>'2007-1-1'" -hhostname -uusername -p dbname > ./filename 

Enter password:

直接复制data目录其实也可以,但是如果有innodb引擎表的话,还要拷贝my.ini文件以及innodb表空间文件以及他的回滚日志文件

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28371090/viewspace-768849/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/28371090/viewspace-768849/

你可能感兴趣的文章
WebSphere Application Server 常见问题及解答:安全
查看>>
WebSphere Application Server 常见问题及解答:集群
查看>>
使用 SIBus JMS 提供者
查看>>
调试 SCA 调用
查看>>
SOA 治理框架和解决方案架构
查看>>
面向企业的云计算—了解云的一些基本概念
查看>>
实现基于角色的授权
查看>>
使用定制工作流程更新 RSS 数据源
查看>>
使用 WebSphere Business Modeler 进行业务建模
查看>>
SOA 案例研究:Web 2.0 SOA 场景
查看>>
IBM BPM BlueWorks:一次 WebSphere 云试验
查看>>
websphere笔记
查看>>
使用 WebSphere Process Server 关系开发集成解决方案(2)
查看>>
最新最全的Portlet 通信过程详解
查看>>
在LINUX中安装WEB SPHERE5.1的正确方法
查看>>
WebSphere简单故障排查
查看>>
ITCAM for Websphere v6.0与ITM v6.1集成的快速指南
查看>>
数据泵 TTS(传输表空间技术)
查看>>
weblogic管理2 - 创建并启动一个managed server
查看>>
linux下开机自动开启单机oracle
查看>>