1. 首页 > 国产数据库教程 > YashanDB教程 > 正文

yashandb教程FG188-YashanDB大批量更新和删除

本文档风哥主要介绍YashanDB大批量更新和删除优化相关知识,包括YashanDB大批量更新和删除的概念、挑战、优势、规划与配置、实现、监控、故障排查、生产案例与实战讲解等内容,风哥教程参考YashanDB官方文档性能调优内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 YashanDB大批量更新和删除的概念

YashanDB大批量更新和删除是指一次性对数据库中大量数据进行更新或删除操作,通常用于数据清理、数据维护、数据同步等场景。大批量更新和删除是数据库操作中的常见操作,对数据库性能有重要影响。更多视频教程www.fgedu.net.cn

YashanDB大批量更新和删除的应用场景:

  • 数据清理:清理过期或无用的数据
  • 数据维护:更新数据状态或属性
  • 数据同步:与外部系统同步数据
  • 批量处理:批量更新或删除符合条件的数据

1.2 YashanDB大批量更新和删除的挑战

YashanDB大批量更新和删除的常见挑战包括:

  • 性能问题:大批量更新和删除可能导致数据库性能下降
  • 事务日志:大批量更新和删除会产生大量事务日志
  • 锁冲突:大批量更新和删除可能导致锁冲突
  • 内存使用:大批量更新和删除可能消耗大量内存
  • 回滚困难:大批量更新和删除的回滚可能非常耗时

1.3 YashanDB大批量更新和删除的优势

YashanDB大批量更新和删除的优势包括:

  • 减少网络开销:批量操作减少了网络往返次数
  • 减少事务开销:批量操作减少了事务提交次数
  • 提高操作速度:批量操作比单条操作更快
  • 减少日志生成:批量操作可以减少事务日志的生成
  • 简化代码:批量操作可以简化应用代码
风哥提示:大批量更新和删除是数据库操作中的常见操作,对数据库性能有重要影响。在实施大批量更新和删除时,应根据数据量和系统资源选择合适的方法和参数配置。学习交流加群风哥微信: itpux-com

Part02-生产环境规划与建议

2.1 YashanDB大批量更新和删除规划

YashanDB大批量更新和删除规划建议:

# 大批量更新和删除规划原则
– 评估数据量:评估需要更新或删除的数据量
– 选择操作方法:根据数据量选择合适的操作方法
– 规划操作时间:选择业务低峰期进行大批量操作
– 预留系统资源:确保数据库有足够的内存和磁盘空间
– 制定回滚计划:制定操作失败的回滚计划

# 操作方法选择
– 小批量数据(<10,000行):使用普通UPDATE/DELETE语句
– 中批量数据(10,000-1,000,000行):使用批量操作语句
– 大批量数据(>1,000,000行):使用分区表或分批操作

# 系统资源规划
– 内存:确保有足够的内存用于数据缓存
– 磁盘:确保有足够的磁盘空间用于日志和回滚段
– CPU:确保有足够的CPU资源用于数据处理
– 网络:确保网络带宽足够用于数据传输

2.2 YashanDB大批量更新和删除参数配置

YashanDB大批量更新和删除参数配置建议:

# 大批量更新和删除参数配置

# 共享缓冲区大小
shared_buffers = 8GB

# 工作内存大小
work_mem = 128MB

# 维护工作内存
maintenance_work_mem = 2GB

# 事务日志缓冲区
wal_buffers = 64MB

# 检查点配置
checkpoint_timeout = 15min
checkpoint_completion_target = 0.9

# 预写式日志配置
wal_writer_delay = 200ms

# 后台写入器配置
bgwriter_delay = 200ms
bgwriter_lru_maxpages = 100
bgwriter_lru_multiplier = 2.0

# 归档模式
archive_mode = on
archive_command = ‘cp %p /yashandb/archive/%f’

# 并行度
max_parallel_workers = 4

# 回滚段大小
rollback_segments = 16

2.3 YashanDB大批量更新和删除最佳实践

YashanDB大批量更新和删除最佳实践:

# 大批量更新和删除最佳实践

# 1. 准备工作
– 备份数据:在操作前备份相关数据
– 禁用触发器:大批量操作时暂时禁用触发器
– 禁用约束:大批量操作时暂时禁用外键约束
– 禁用索引:大批量操作时暂时禁用索引,操作完成后重建
– 调整参数:根据数据量调整数据库参数

# 2. 操作方法
– 使用批量操作语句:UPDATE/DELETE语句加WHERE条件
– 使用分批操作:将大批量数据分成多个小批次操作
– 使用并行操作:启用并行DML提高性能
– 使用分区表:利用分区表特性快速删除数据

# 3. 分批操作
– 将大批量数据分成多个小批次操作
– 每批次操作后提交事务
– 控制每批次的大小,避免内存溢出和锁冲突

# 4. 监控与优化
– 监控操作进度和性能
– 调整批次大小和并行度
– 及时解决操作过程中的问题

生产环境建议:大批量更新和删除操作需要充分准备和规划,确保系统资源充足,避免影响正常业务。建议在测试环境中进行充分测试,找到最优的操作方法和参数配置。学习交流加群风哥QQ113257174

Part03-生产环境项目实施方案

3.1 YashanDB大批量更新和删除实现

3.1.1 使用批量UPDATE语句

# 使用批量UPDATE语句

# 批量更新语法
UPDATE fgedu.orders
SET status = ‘COMPLETED’
WHERE order_date < TO_DATE('2026-01-01', 'YYYY-MM-DD'); # 批量更新示例 SQL> UPDATE fgedu.orders
2 SET status = ‘COMPLETED’
3 WHERE order_date < TO_DATE('2026-01-01', 'YYYY-MM-DD'); 10000 rows updated. Elapsed: 00:00:30 # 分批更新示例 SQL> BEGIN
2 FOR i IN 1..10 LOOP
3 UPDATE fgedu.orders
4 SET status = ‘COMPLETED’
5 WHERE order_date < TO_DATE('2026-01-01', 'YYYY-MM-DD') 6 AND rownum <= 1000; 7 COMMIT; 8 DBMS_LOCK.SLEEP(1); -- 暂停1秒,减少系统压力 9 END LOOP; 10 END; 11 / PL/SQL procedure successfully completed. Elapsed: 00:01:40 # 使用并行更新 SQL> UPDATE /*+ PARALLEL(4) */ fgedu.orders
2 SET status = ‘COMPLETED’
3 WHERE order_date < TO_DATE('2026-01-01', 'YYYY-MM-DD'); 10000 rows updated. Elapsed: 00:00:15

3.1.2 使用批量DELETE语句

# 使用批量DELETE语句

# 批量删除语法
DELETE FROM fgedu.orders
WHERE order_date < TO_DATE('2025-01-01', 'YYYY-MM-DD'); # 批量删除示例 SQL> DELETE FROM fgedu.orders
2 WHERE order_date < TO_DATE('2025-01-01', 'YYYY-MM-DD'); 5000 rows deleted. Elapsed: 00:00:20 # 分批删除示例 SQL> BEGIN
2 LOOP
3 DELETE FROM fgedu.orders
4 WHERE order_date < TO_DATE('2025-01-01', 'YYYY-MM-DD') 5 AND rownum <= 1000; 6 EXIT WHEN SQL%ROWCOUNT = 0; 7 COMMIT; 8 DBMS_LOCK.SLEEP(1); -- 暂停1秒,减少系统压力 9 END LOOP; 10 END; 11 / PL/SQL procedure successfully completed. Elapsed: 00:00:55 # 使用TRUNCATE语句(适用于清空表) SQL> TRUNCATE TABLE fgedu.orders;

Table truncated.

Elapsed: 00:00:01

3.1.3 使用分区表特性

# 使用分区表特性

# 创建分区表
SQL> CREATE TABLE fgedu.orders (
2 order_id NUMBER PRIMARY KEY,
3 customer_id NUMBER,
4 order_date DATE,
5 status VARCHAR2(20)
6 ) PARTITION BY RANGE (order_date) (
7 PARTITION p2025 VALUES LESS THAN (TO_DATE(‘2026-01-01’, ‘YYYY-MM-DD’)),
8 PARTITION p2026 VALUES LESS THAN (TO_DATE(‘2027-01-01’, ‘YYYY-MM-DD’)),
9 PARTITION p2027 VALUES LESS THAN (MAXVALUE)
10 );

# 批量删除分区数据
SQL> ALTER TABLE fgedu.orders DROP PARTITION p2025;

Table altered.

Elapsed: 00:00:05

# 批量更新分区数据
SQL> UPDATE fgedu.orders PARTITION (p2026)
2 SET status = ‘COMPLETED’
3 WHERE order_date < TO_DATE('2026-06-01', 'YYYY-MM-DD'); 5000 rows updated. Elapsed: 00:00:10

3.2 YashanDB大批量更新和删除监控

3.2.1 YashanDB大批量更新和删除监控命令

# 大批量更新和删除监控命令

# 查看操作进度
SQL> SELECT * FROM v$session_longops;

# 查看会话信息
SQL> SELECT sid, serial#, username, program, status, event FROM v$session;

# 查看数据库状态
SQL> SELECT * FROM v$instance;

# 查看表空间使用情况
SQL> SELECT tablespace_name, used_percent FROM dba_tablespace_usage_metrics;

# 查看事务日志状态
SQL> SELECT * FROM v$log;

# 查看系统资源使用情况
SQL> SELECT * FROM v$sysstat WHERE name LIKE ‘%update%’ OR name LIKE ‘%delete%’;

# 查看锁状态
SQL> SELECT * FROM v$lock;

3.2.2 YashanDB大批量更新和删除监控脚本

#!/bin/bash
# batch_ud_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`

# 大批量更新和删除监控脚本

# 输出文件
output_file=”/tmp/batch_ud_monitor_$(date +%Y%m%d_%H%M%S).log”

echo “开始监控大批量更新和删除” > ${output_file}
echo “监控时间: $(date)” >> ${output_file}
echo “” >> ${output_file}

# 查看操作进度
echo “===== 操作进度 ====” >> ${output_file}
sqlplus -s / as sysdba << EOF >> ${output_file}
SELECT * FROM vsession_longops;
EXIT;
EOF
echo “” >> ${output_file}

# 查看会话信息
echo “===== 会话信息 ====” >> ${output_file}
sqlplus -s / as sysdba << EOF >> ${output_file}
SELECT sid, serial#, username, program, status, event FROM vsession;
EXIT;
EOF
echo “” >> ${output_file}

# 查看表空间使用情况
echo “===== 表空间使用情况 ====” >> ${output_file}
sqlplus -s / as sysdba << EOF >> ${output_file}
SELECT tablespace_name, used_percent FROM dba_tablespace_usage_metrics;
EXIT;
EOF
echo “” >> ${output_file}

# 查看锁状态
echo “===== 锁状态 ====” >> ${output_file}
sqlplus -s / as sysdba << EOF >> ${output_file}
SELECT * FROM vlock;
EXIT;
EOF
echo “” >> ${output_file}

echo “监控完成,结果保存至:${output_file}” >> ${output_file}
echo “监控完成,结果保存至:${output_file}”

3.3 YashanDB大批量更新和删除故障排查

3.3.1 YashanDB大批量更新和删除故障排查步骤

# 大批量更新和删除故障排查步骤

# 1. 检查操作状态
SQL> SELECT * FROM v$session_longops;

# 2. 检查会话信息
SQL> SELECT sid, serial#, username, program, status, event FROM v$session;

# 3. 检查错误日志
SQL> SELECT * FROM v$diag_info;
$ tail -n 100 /yashandb/app/log/fgedudb_alert.log

# 4. 检查表空间使用情况
SQL> SELECT tablespace_name, used_percent FROM dba_tablespace_usage_metrics;

# 5. 检查系统资源使用情况
SQL> SELECT * FROM v$sysstat WHERE name LIKE ‘%update%’ OR name LIKE ‘%delete%’;

# 6. 检查数据库参数
SQL> SHOW PARAMETER shared_buffers;
SQL> SHOW PARAMETER work_mem;

# 7. 检查锁状态
SQL> SELECT * FROM v$lock;

# 8. 解决问题
# 终止卡住的会话
SQL> ALTER SYSTEM KILL SESSION ‘sid,serial#’;

# 增加表空间
SQL> ALTER TABLESPACE fgedutbs ADD DATAFILE ‘/yashandb/fgdata/fgedudb/fgedutbs02.dbf’ SIZE 100GB;

3.3.2 YashanDB大批量更新和删除常见错误及解决方法

# 常见错误及解决方法

# 错误1:表空间不足
ERROR: ORA-01653: unable to extend table FGEDU.ORDERS by 128 in tablespace FGEDUTBS

# 解决方法:增加表空间
SQL> ALTER TABLESPACE fgedutbs ADD DATAFILE ‘/yashandb/fgdata/fgedudb/fgedutbs02.dbf’ SIZE 100GB;

# 错误2:回滚段不足
ERROR: ORA-01562: failed to extend rollback segment number 1

# 解决方法:增加回滚段
SQL> ALTER ROLLBACK SEGMENT rbs01 ONLINE;

# 错误3:锁冲突
ERROR: ORA-00060: deadlock detected while waiting for resource

# 解决方法:检查并解决锁冲突
SQL> SELECT * FROM v$lock_conflicts;

# 错误4:内存不足
ERROR: ORA-04030: out of process memory when trying to allocate 16777216 bytes

# 解决方法:增加内存或调整参数
SQL> ALTER SYSTEM SET work_mem = ’64MB’ SCOPE=spfile;

# 错误5:事务超时
ERROR: ORA-01013: user requested cancel of current operation

# 解决方法:增加事务超时时间或分批操作

风哥提示:大批量更新和删除操作需要充分准备和监控,及时发现和解决问题。建议在操作前进行充分的测试和规划,确保操作过程的顺利进行。更多学习教程公众号风哥教程itpux_com

Part04-生产案例与实战讲解

4.1 YashanDB大批量更新案例

案例背景:某企业需要将10万条订单数据的状态更新为”COMPLETED”。

# 案例配置

# 1. 目标表结构
SQL> CREATE TABLE fgedu.orders (
2 order_id NUMBER PRIMARY KEY,
3 customer_id NUMBER,
4 order_date DATE,
5 status VARCHAR2(20),
6 amount NUMBER(10,2)
7 );

# 2. 插入测试数据
SQL> INSERT INTO fgedu.orders (order_id, customer_id, order_date, status, amount)
2 SELECT
3 level,
4 1000 + level,
5 SYSDATE – level,
6 ‘PENDING’,
7 100.00
8 FROM dual
9 CONNECT BY level <= 100000; 100000 rows created. # 3. 批量更新数据 SQL> UPDATE /*+ PARALLEL(4) */ fgedu.orders
2 SET status = ‘COMPLETED’
3 WHERE order_date < SYSDATE - 30; 80000 rows updated. Elapsed: 00:00:45 # 4. 验证数据 SQL> SELECT status, COUNT(*) FROM fgedu.orders GROUP BY status;

STATUS COUNT(*)
——– ———-
COMPLETED 80000
PENDING 20000

# 5. 优化措施
– 使用并行更新:启用并行DML
– 调整参数:增加work_mem和maintenance_work_mem
– 分批更新:将10万条数据分成10批,每批1万条

4.2 YashanDB大批量删除案例

案例背景:某电商系统需要删除100万条过期订单数据。

# 案例配置

# 1. 目标表结构
SQL> CREATE TABLE fgedu.orders (
2 order_id NUMBER PRIMARY KEY,
3 customer_id NUMBER,
4 order_date DATE,
5 status VARCHAR2(20),
6 amount NUMBER(10,2)
7 ) PARTITION BY RANGE (order_date) (
8 PARTITION p2025 VALUES LESS THAN (TO_DATE(‘2026-01-01’, ‘YYYY-MM-DD’)),
9 PARTITION p2026 VALUES LESS THAN (TO_DATE(‘2027-01-01’, ‘YYYY-MM-DD’)),
10 PARTITION p2027 VALUES LESS THAN (MAXVALUE)
11 );

# 2. 插入测试数据
SQL> INSERT INTO fgedu.orders (order_id, customer_id, order_date, status, amount)
2 SELECT
3 level,
4 1000 + level,
5 SYSDATE – level,
6 ‘COMPLETED’,
7 100.00
8 FROM dual
9 CONNECT BY level <= 1000000; 1000000 rows created. # 3. 批量删除数据 # 使用分区删除 SQL> ALTER TABLE fgedu.orders DROP PARTITION p2025;

Table altered.

Elapsed: 00:00:15

# 4. 验证数据
SQL> SELECT COUNT(*) FROM fgedu.orders;

COUNT(*)
———-
365000

# 5. 优化措施
– 使用分区表:利用分区表特性快速删除数据
– 禁用索引:删除前禁用索引,删除后重建
– 调整参数:增加work_mem和maintenance_work_mem

4.3 YashanDB大批量更新和删除混合案例

案例背景:某金融系统需要更新50万条交易数据的状态,并删除10万条过期数据。

# 案例配置

# 1. 目标表结构
SQL> CREATE TABLE fgedu.transactions (
2 transaction_id NUMBER PRIMARY KEY,
3 account_id NUMBER,
4 transaction_date DATE,
5 amount NUMBER(10,2),
6 transaction_type VARCHAR2(10),
7 status VARCHAR2(20)
8 );

# 2. 插入测试数据
SQL> INSERT INTO fgedu.transactions (transaction_id, account_id, transaction_date, amount, transaction_type, status)
2 SELECT
3 level,
4 1000 + level,
5 SYSDATE – level,
6 100.00,
7 ‘DEPOSIT’,
8 ‘PENDING’
9 FROM dual
10 CONNECT BY level <= 500000; 500000 rows created. # 3. 批量更新数据 SQL> BEGIN
2 FOR i IN 1..5 LOOP
3 UPDATE fgedu.transactions
4 SET status = ‘COMPLETED’
5 WHERE transaction_date < SYSDATE - 7 6 AND rownum <= 100000; 7 COMMIT; 8 DBMS_LOCK.SLEEP(1); -- 暂停1秒,减少系统压力 9 END LOOP; 10 END; 11 / PL/SQL procedure successfully completed. Elapsed: 00:02:30 # 4. 批量删除数据 SQL> BEGIN
2 LOOP
3 DELETE FROM fgedu.transactions
4 WHERE transaction_date < SYSDATE - 365 5 AND rownum <= 10000; 6 EXIT WHEN SQL%ROWCOUNT = 0; 7 COMMIT; 8 DBMS_LOCK.SLEEP(1); -- 暂停1秒,减少系统压力 9 END LOOP; 10 END; 11 / PL/SQL procedure successfully completed. Elapsed: 00:01:45 # 5. 验证数据 SQL> SELECT status, COUNT(*) FROM fgedu.transactions GROUP BY status;

STATUS COUNT(*)
——– ———-
COMPLETED 450000
PENDING 40000

# 6. 优化措施
– 分批操作:将大批量数据分成多个小批次操作
– 并行处理:启用并行DML提高性能
– 监控进度:实时监控操作进度和系统状态

生产环境建议:大批量更新和删除操作需要根据数据量和系统资源选择合适的方法和参数配置。建议在实施前进行充分的测试和评估,确保操作过程的顺利进行。from yashanDB视频:www.itpux.com

Part05-风哥经验总结与分享

5.1 YashanDB大批量更新和删除经验总结

YashanDB大批量更新和删除经验总结:

  • 准备工作:在操作前进行充分的准备,包括数据备份、表结构优化等
  • 选择合适的方法:根据数据量选择合适的操作方法,如批量UPDATE/DELETE、分批操作或分区表
  • 优化参数:根据数据量和系统资源调整数据库参数,如shared_buffers、work_mem等
  • 分批操作:将大批量数据分成多个小批次操作,避免内存溢出和锁冲突
  • 监控与调优:实时监控操作进度和系统状态,及时调整操作策略
  • 索引和约束:在操作前暂时禁用索引和约束,操作完成后重建
  • 并行处理:对于大批量数据,使用并行操作提高效率
  • 错误处理:制定操作失败的回滚计划,确保数据一致性
风哥提示:大批量更新和删除是数据库操作中的常见操作,需要根据实际情况选择合适的方法和参数配置。建议在实施前进行充分的测试和评估,确保操作过程的顺利进行。

5.2 YashanDB大批量更新和删除检查清单

# YashanDB大批量更新和删除检查清单
– [ ] 数据备份是否完成
– [ ] 目标表结构是否合理
– [ ] 表空间是否有足够空间
– [ ] 数据库参数是否优化配置
– [ ] 索引和约束是否需要临时禁用
– [ ] 操作方法是否选择合适
– [ ] 分批操作策略是否制定
– [ ] 监控机制是否建立
– [ ] 回滚计划是否制定
– [ ] 测试环境是否验证

# 大批量更新和删除实施流程
1. 需求分析:明确更新或删除数据的规模和条件
2. 环境准备:备份数据,调整参数
3. 测试验证:在测试环境中进行操作测试
4. 正式实施:在生产环境中执行操作
5. 监控运维:实时监控操作进度和系统状态
6. 验证测试:验证操作结果的正确性
7. 优化改进:总结经验,优化操作策略

5.3 YashanDB大批量更新和删除工具推荐

YashanDB大批量更新和删除常用工具:

  • SQL语句:使用批量UPDATE/DELETE语句
  • PL/SQL:使用PL/SQL进行分批操作
  • 分区表:利用分区表特性快速删除数据
  • 并行DML:启用并行DML提高性能
  • 自定义脚本:根据业务需求开发的自定义操作脚本
  • ETL工具:如Informatica、Talend等,支持复杂数据处理
持续改进:大批量更新和删除操作需要根据实际情况不断调整和优化。建议定期评估操作性能,及时发现和解决问题,确保操作过程的高效和稳定。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息