Home  >  Article  >  Database  >  定时对大数据量的表进行分表对数据备份

定时对大数据量的表进行分表对数据备份

WBOY
WBOYOriginal
2016-06-07 17:11:561115browse

工作中遇到数据库中一个表的数据量比较大,属于日志表。正常情况下是不会有查询操作的,但如果不进行分表数据太多,执行一条简单

工作中遇到数据库中一个表的数据量比较大,属于日志表。正常情况下是不会有查询操作的,但如果不进行分表数据太多,执行一条简单sql语句要等好几分钟。。

分表工具:linux的shell + mysql自身提供的管理命令

原理:使用一个和原表数据结构一样的表,替换原表。

Linux Shell内容如下:

=======================开始

DATE=`date +%Y%m%d`   #当前日期备份

BACKUP_DIRECTORY="/var/db_backup"  #备份的目录,主要存放备份中需要的临时表

 

DB_USER="root"               #数据库用户

DB_PWD="123456"         #数据库密码

 

WSM_APPENTRYREQLOG_SHELL="$BACKUP_DIRECTORY/db_appentryreqlog_shell.sql"                     #替换表db_appentryreqlog时执行的sql命令文件存放位置

WSM_ADENTRYSHOWRECORD_SHELL="$BACKUP_DIRECTORY/db_adentryshowrecord_shell.sql"      #替换表 db_adentryshowrecord时执行的sql命令文件存放位置

 

WSM_APPENTRYREQLOG_FILE="$BACKUP_DIRECTORY/db_appentryreqlog_nodata.sql"                    #导出表db_appentryreqlog结构时的文件存放位置

WSM_ADENTRYSHOWRECORD_FILE="$BACKUP_DIRECTORY/db_adentryshowrecord_nodata.sql"     #导出表db_adentryshowrecord结构时的文件存放位置

 

rm -f $WSM_APPENTRYREQLOG_FILE                                                                                                   #如果已经存在文件,,则删除

rm -f $WSM_ADENTRYSHOWRECORD_FILE                                                                                           #如果已经存在文件,则删除

 

mysqldump -u$DB_USER -p$DB_PWD -d db db_appentryreqlog > $WSM_APPENTRYREQLOG_FILE    #导出表结构

mysqldump -u$DB_USER -p$DB_PWD -d db db_adentryshowrecord > $WSM_ADENTRYSHOWRECORD_FILE  #导出表结构

 

sed -i "s/wsm_appentryreqlog/db_appentryreqlog_new/" $WSM_APPENTRYREQLOG_FILE                         #将导出的表结构中表名称wsm_appentryreqlog替换为临时名称db_appentryreqlog_new

sed -i "s/wsm_adentryshowrecord/db_adentryshowrecord_new/" $WSM_ADENTRYSHOWRECORD_FILE   #同上

 

sed -i 's/AUTO_INCREMENT=[0-9]\+/AUTO_INCREMENT=1/' $WSM_APPENTRYREQLOG_FILE                     #新表结构,ID自增值重置为1

sed -i 's/AUTO_INCREMENT=[0-9]\+/AUTO_INCREMENT=1/' $WSM_ADENTRYSHOWRECORD_FILE

 

sed -i "s/db_appentryreqlog_bak/db_appentryreqlog_$DATE/" $WSM_APPENTRYREQLOG_SHELL                            #将db_appentryreqlog_shell.sql文件中的备份表名称根据日期动态替换

sed -i "s/db_adentryshowrecord_bak/db_adentryshowrecord_$DATE/" $WSM_ADENTRYSHOWRECORD_SHELL      #同上

 

#cat $WSM_APPENTRYREQLOG_FILE

#echo '---------------------------------------------------------------------------------1'

#cat $WSM_ADENTRYSHOWRECORD_FILE

#echo '---------------------------------------------------------------------------------2'

#cat $WSM_APPENTRYREQLOG_SHELL

#echo '---------------------------------------------------------------------------------3'

#cat $WSM_ADENTRYSHOWRECORD_SHELL

#echo '---------------------------------------------------------------------------------4'

 

#以上准备工作完成,开始替换表

mysql -u$DB_USER -p$DB_PWD db

mysql -u$DB_USER -p$DB_PWD db

 

mysql -u$DB_USER -p$DB_PWD db

mysql -u$DB_USER -p$DB_PWD db

 

#恢复文件db_appentryreqlog_shell.sql和db_adentryshowrecord_shell.sql的内容为修改前

sed -i "s/db_appentryreqlog_$DATE/db_appentryreqlog_bak/" $WSM_APPENTRYREQLOG_SHELL

sed -i "s/db_adentryshowrecord_$DATE/db_adentryshowrecord_bak/" $WSM_ADENTRYSHOWRECORD_SHELL

 

#执行完毕。

=======================结束 

其中db_appentryreqlog_shell.sq文件的内容为

RENAME TABLE db_appentryreqlog TO db_appentryreqlog_bak,db_appentryreqlog_new TO db_appentryreqlog;

db_adentryshowrecord_shell.sql文件的内容为

RENAME TABLE db_adentryshowrecord TO db_adentryshowrecord_bak,db_adentryshowrecord_new TO db_adentryshowrecord;   #先把旧表改名备份,然后把新的表改成旧表的名字

将shell命令文件 以及db_appentryreqlog_shell.sq和db_adentryshowrecord_shell.sql文件都放置到BACKUP_DIRECTORY="/var/db_backup"目录下

然后把shell命令配置到定时任务cron里面,OK了。

linux

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn