视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
定时对大数据量的表进行分表对数据备份
2020-11-09 11:37:12 责编:小采
文档


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

工作中遇到数据库中一个表的数据量比较大,属于日志表。正常情况下是不会有查询操作的,但如果不进行分表数据太多,执行一条简单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 < $WSM_APPENTRYREQLOG_FILE #先把新的表结构导入进去

mysql -u$DB_USER -p$DB_PWD db < $WSM_APPENTRYREQLOG_SHELL

mysql -u$DB_USER -p$DB_PWD db < $WSM_ADENTRYSHOWRECORD_FILE #执行替换表命令

mysql -u$DB_USER -p$DB_PWD db < $WSM_ADENTRYSHOWRECORD_SHELL

#恢复文件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了。

下载本文
显示全文
专题