工作中遇到数据库中一个表的数据量比较大,属于日志表。正常情况下是不会有查询操作的,但如果不进行分表数据太多,执行一条简单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了。
分享到:
相关推荐
利用python进行数据表分表,目的是将一个大的excel文本按照规则生成对应的小文件
1、修改表名 2、创建新表 3、按时间条件插入数据 由于数据太大、用的改表名的方式备份分表,通过传入表名和条件字段名备份相应的表
kettle对数据分表插入 数据库Oracle etl工具 kettle 通过java脚本,hash算法,实现分表数据写入
mysql分库备份和分表备份 分库备份:将 mysql 数据库中的用户数据库备份,备份的数据库文件以时间命名 分库分表备份:备份每个数据库的表,同一个库中的表,放在对应数据库名字命名的目录下
资源里包含SQL文档:创建数据库和存储过程.sql 生成数据.sql 测试.sql 比较完善的大量数据分表功能代码,包含...数据按照每个月创建一个数据表,通过存储过程输入参数,按照指定日期跨表查询数据,并且可以分页查询。
① 创建数据库 ② 在创建的数据库中添加文件组 ③ 在文件组中添加新的文件 ④ 定义分区函数 ⑤ 定义分区架构 ⑥ 定义分区表 ⑦ 定义代理作业,自动添加分区分割点 ⑧ 测试数据
主要介绍了超大数据量存储常用数据库分表分库算法总结,本文讲解了按自然时间来分表/分库、按数字类型hash分表/分库、按md5值来分表/分库三种方法,以及分表所带来的问题探讨,需要的朋友可以参考下
水平拆分数据分库和分表的核心问题是表的ID唯一,然后根据唯一的ID映射到一个物理存储位置,这个映射方案要考虑到满足数据量暴增线性扩展和业务上容易保持一致,本文主要讨论分库分表如何映射的问题。
利用MybatisPlus来实现对表的水平分表,全自动,可以首先判断表是否存在,不存在创建表,然后设计有定时任务,可以每个月月末的时候,去创建下一个分表程序
不同的数据库写在对应的包名下分别进行扫描, 通过对id的取模运算实现分表的能力, 此代码仅只是提供思路,具体的实现方案还需要完善
spring动态数据源整合mybatis实现的分库分表操作。 分库分表对业务代码是透明的,只需要在配置文件分配分库模版即可动态的实现分库分表的增删改查操作。
一个简单的oracle数据库环境下的存储过程,介绍了如何从带年月人的分表取数据
通过使用sharding-jdbc分库分表,以及多数据源的切换
- 产品上线以后,数据量越来越大,当一个表有几十万上百万条记录的时候,是时候考虑分表了。【超过几千万记录的话,这个分表估计不适合。】 - 怎么做 - 分表情况,1:hash分表,按照目标表的id的hash值,写入对应...
mysql导出指定表并分表存储sql文件且压缩的shell脚本,数据库数据过大时,可以用于数据库备份
这是一份康盛数据分表的实现代码,支持自动分表,同时支持跨表跨范围定位数据。
SQL,大数据分表,SQL千万级分表,删除百万数据
在MySQL中,当一张表的数据过大的时候,操作速度会变慢,而且给维护带来麻烦,分表设计的思想正好解决了这一问题。
mysql主表下分10个分表,每次插入分表数据,自动会增加主表数据sql语句
总表汇总分表模板.rar