有哪些网站可以做毕业设计,上海建筑装饰集团有限公司,编程 网站建设,广州保安公司注册一、需求
按业务逻辑删除大量表数据操作不卡库#xff0c;不能影响正常业务操作操作不能造成 60 秒以上的复制延迟满足以上条件的前提下#xff0c;尽快删除数据并释放所占空间 表结构如下#xff1a;
create table space_visit_av (userid bigint(20) not null comment 用…一、需求
按业务逻辑删除大量表数据操作不卡库不能影响正常业务操作操作不能造成 60 秒以上的复制延迟满足以上条件的前提下尽快删除数据并释放所占空间 表结构如下
create table space_visit_av (userid bigint(20) not null comment 用户id,avid bigint(20) not null comment 作品id,touserid bigint(20) not null comment 被访问用户d,createtime timestamp not null default current_timestamp comment 创建时间,updatetime timestamp not null default current_timestamp on update current_timestamp comment 收藏时间,primary key (userid,avid),key index_1 (touserid,updatetime) using btree,key index_2 (avid,updatetime) using btree,key idx_updatetime (updatetime)
) engineinnodb default charsetutf8 comment用户访问作品表; 表中现有约 50 亿条数据只保留 2023-10-01 以后的数据约占总量的 1/10其它删除。
二、实现
1. 主库按原表创建删除关联表只保留原表的主键
mysql -uwxy -p123456 -h10.10.10.1 -P18251 -Dspace -e
create table del (userid bigint(20) not null comment 用户id,avid bigint(20) not null comment 作品id,primary key (userid,avid));
2. 导出需要删除数据的主键到文件
-- 在从库执行查询
select userid, avid into outfile /data/del.txt from space_visit_av where updatetime 2023-10-01;
3. 将文件分割成 10 万行一个的小文件
cd /data
split -l 100000 -d -a 6 del.txt# 删除原文件
rm del.txt
4. 遍历文件执行删除
# 后台执行
nohup ~/del.sh ~/del.log 21 del.sh 脚本文件内容如下
#!/bin/bash
source ~/.bashrcdir/data/
ls $dir | while read line
dofile${dir}${line}# 表关联删除数据mysql -wxy -p123456 -h10.10.10.1 -P18251 -Dspace --local-infile -e delete from del;load data local infile $file into table del;analyze table del; analyze table space_visit_av;delete t1 from space_visit_av t1, del t2 where t1.useridt2.userid and t1.avidt2.avid; -vvvecho ${line}# 取得所有从库的延迟秒数s1mysql -wxy -p123456 -h10.10.10.2 -P18251 -e show slave status\G 2/dev/null | egrep Seconds_Behind_Master | awk -F: {print $2}s2mysql -wxy -p123456 -h10.10.10.3 -P18251 -e show slave status\G 2/dev/null | egrep Seconds_Behind_Master | awk -F: {print $2}s3mysql -wxy -p123456 -h10.10.10.4 -P18251 -e show slave status\G 2/dev/null | egrep Seconds_Behind_Master | awk -F: {print $2}# 只有所有从库延迟小于等于 1 秒时继续执行删除否则等待从库追赶while ((s1 1)) || ((s2 1)) || ((s3 1))dosleep 1;s1mysql -wxy -p123456 -h10.10.10.2 -P18251 -e show slave status\G 2/dev/null | egrep Seconds_Behind_Master | awk -F: {print $2}s2mysql -wxy -p123456 -h10.10.10.3 -P18251 -e show slave status\G 2/dev/null | egrep Seconds_Behind_Master | awk -F: {print $2}s3mysql -wxy -p123456 -h10.10.10.4 -P18251 -e show slave status\G 2/dev/null | egrep Seconds_Behind_Master | awk -F: {print $2}echo $s1 $s2 $s3donedone# 删除完成后分析原表删除关联表
mysql -wxy -p123456 -h10.10.10.1 -P18251 -Dspace -e analyze table space_visit_av;drop table del;
5. 所有从库分析表
mysql -wxy -p123456 -h10.10.10.2 -P18251 -Dspace -e analyze table space_visit_av;
mysql -wxy -p123456 -h10.10.10.3 -P18251 -Dspace -e analyze table space_visit_av;
mysql -wxy -p123456 -h10.10.10.4 -P18251 -Dspace -e analyze table space_visit_av;
6. 使用 pt-online-schema-change 释放删除数据所占空间
# 后台执行
nohup ~/shrink.sh ~/shrink.log 21 shrink.sh 脚本文件内容如下
#!/bin/bash
source ~/.bashrc# 连接主库执行
pt-online-schema-change \
--host10.10.10.1 \
--port18251 \
--userwxy \
--password123456 \
--charsetutf8mb4 \
--chunk-size10000 \
--recursion-methodprocesslist \
--check-interval10s \
--max-lag60s \
--nocheck-replication-filters \
--critical-loadThreads_running512 \
--max-loadThreads_running256 \
Dspace,tspace_visit_av \
--progresstime,30 \
--execute