MySQL에서 큰 테이블을 직접 삭제하면 MySQL이 중단되어 비즈니스에 부정적인 영향을 미칠 수 있습니다. 매우 큰 테이블을 삭제하기 위한 전제조건은 테이블이 독립된 테이블스페이스이므로 삭제가 효과적이라는 것입니다.
# du -sh pay_bills.ibd 175G pay_bills.ibd # 创建硬链接 # ln pay_bills.ibd pay_bills.ibd_hdlk
Linux에서 각 저장소 파일에는 파일을 가리키는 Inode 인덱스가 있으며 여러 파일 이름은 동일한 Inode 인덱스를 통해 동일한 저장소 파일을 가리킬 수 있습니다.
파일 이름으로 참조되는 Inode Index가 다른 파일 이름에서도 참조되는 경우 해당 파일 이름과 Inode Index 간의 참조만 삭제됩니다.
파일 이름으로 참조되는 Inode Index가 다른 파일에서 참조되지 않는 경우 파일 이름과 Inode 인덱스 사이의 참조를 제거하고 Inode 인덱스가 가리키는 저장 파일을 삭제합니다.
실제로는 pay_bills.ibd에 대한 파일 참조만 삭제합니다. 실제 파일에 대한 pay_bills.ibd_hdlk 참조는 여전히 존재하므로 OS 수준 삭제 작업은 수행되지 않으며 IO 변동이 작아서 영향이 줄어듭니다. MySQL에서.
mysql> drop table pay_bills; Query OK, 0 rows affected (3.24 sec)
잘라내기 도구 설치
# yum install coreutils -y
삭제 스크립트 실행
#!/bin/bash TRUNCATE=/usr/bin/truncate # 从175G开始每次删除2G,最后如果脚本truncate后还剩下部分文件,使用rm删除 for i in `seq 175 -2 1`; do $TRUNCATE -s ${i}G pay_bills.ibd_hdlk sleep 1 done rm -f pay_bills.ibd_hdlk
처음으로 프로젝트를 시작했는데 성능 테스트를 위해 생성된 데이터의 양이 엄청났습니다. 모두 사용할 수 없는 데이터이지만 일부는 유지해야 합니다. 데이터를 테이블에 삽입하기 전에 데이터를 체계적으로 정리하거나 유용한 데이터를 필터링해야 하는 경우가 많습니다. 테이블 구조를 유지하거나 테이블을 재구축(데이터베이스에서 테이블 구조 내보내기)한 후 SQL 문을 다시 실행하세요.
MySQL은 테이블 데이터를 삭제하거나 지웁니다
1. 잘라내기는 모든 데이터를 삭제하고 테이블 구조를 유지하며 복원을 취소할 수 없습니다.
2. 매우 느린 행 삭제
3. 테이블을 삭제하면 데이터와 테이블 구조가 함께 삭제됩니다.
4. 데이터베이스의 모든 테이블 구조를 내보내고 다시 실행하고 모든 테이블을 지웁니다(4와 일치)
테이블 데이터 구문 지우기
테이블 테이블 이름 자르기(테이블 구조만 유지, 매우 빠름)삭제; 테이블 이름;
열 이름="값"인 테이블 이름에서 삭제
DROP `t_product_events` IF EXIST; CREATE TABLE `t_product_events` ( `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '事件ID', `level` int(11) NULL DEFAULT NULL, `product_id` bigint(20) NOT NULL COMMENT '产品类型ID', `identifier` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '事件名称', `description` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '事件描述', `type` int(11) NOT NULL COMMENT '事件类型,0:info(信息)、1:alert(告警)、2:error(故障)', `ref_id` int(11) UNSIGNED NULL DEFAULT 0 COMMENT '引入模板时有意义', `original_required` tinyint(2) NOT NULL, `update_required` tinyint(2) NOT NULL DEFAULT 0 COMMENT '是否是标准功能的必选事件,0:可选,1:必选', `custom` tinyint(2) NOT NULL COMMENT '0:模板导入,1:自定义', `method` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '事件对应的方法名称(根据identifier生成)', `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0), `ref` bigint(20) NULL DEFAULT NULL, `related` int(11) NULL DEFAULT 0 COMMENT '被预发布或者已发布关联个数', `copyright` tinyint(2) NULL DEFAULT 0 COMMENT '是否发布过, 1 发布过 0未发布', `prerelease` tinyint(2) NULL DEFAULT 0 COMMENT '是否预发布过, 1 预发布过 0未预发布', PRIMARY KEY (`id`) USING BTREE, INDEX `idx_product_id`(`product_id`) USING BTREE COMMENT '查询优化' ) ENGINE = InnoDB AUTO_INCREMENT = 497560 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '产品类型事件表' ROW_FORMAT = Compact;
위 내용은 MySQL에서 매우 큰 테이블을 빠르게 삭제하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!