oracle需要用sqlplus定时备份删除表里面60天前的数据,每次删除10000条,根据数据的创建时间来删除备份的shell脚本
时间: 2023-04-11 19:01:18 浏览: 369
可以使用以下的 SQL 语句来删除表中 60 天前的数据:
DELETE FROM table_name WHERE create_time < SYSDATE - 60;
然后,可以使用以下的 SQL 语句来分批次删除数据:
DECLARE
CURSOR c1 IS SELECT * FROM table_name WHERE create_time < SYSDATE - 60;
TYPE t1 IS TABLE OF c1%ROWTYPE;
l1 t1;
BEGIN
OPEN c1;
LOOP
FETCH c1 BULK COLLECT INTO l1 LIMIT 10000;
EXIT WHEN l1.COUNT = 0;
FORALL i IN 1..l1.COUNT
DELETE FROM table_name WHERE id = l1(i).id;
COMMIT;
END LOOP;
CLOSE c1;
END;
最后,可以将上述 SQL 语句放入一个 shell 脚本中,并使用 crontab 定时执行备份删除操作。
相关问题
我有一个oracle表有千万数据,每天备份数据里面的时间为两个月前的数据到历史表,并删除当前表里面两个月前的数据,每次删除只能删除10000条数据,用shell写个脚本调用sqlplus
我可以回答这个问题。您可以使用以下脚本来实现您的需求:
#!/bin/bash
# 设置变量
TABLE_NAME="your_table_name"
BACKUP_TABLE_NAME="your_backup_table_name"
TWO_MONTHS_AGO=$(date -d "2 months ago" +%Y-%m-%d)
# 备份两个月前的数据到历史表
sqlplus -s username/password << EOF
INSERT INTO ${BACKUP_TABLE_NAME} SELECT * FROM ${TABLE_NAME} WHERE time < TO_DATE('${TWO_MONTHS_AGO}', 'YYYY-MM-DD');
COMMIT;
EOF
# 删除当前表里面两个月前的数据
while true; do
ROWS=$(sqlplus -s username/password << EOF
DELETE FROM ${TABLE_NAME} WHERE time < TO_DATE('${TWO_MONTHS_AGO}', 'YYYY-MM-DD') AND ROWNUM <= 10000;
COMMIT;
SELECT SQL%ROWCOUNT FROM DUAL;
EOF
)
if [[ ${ROWS} -eq 0 ]]; then
break
fi
done
这个脚本会备份两个月前的数据到历史表,并删除当前表里面两个月前的数据,每次删除10000条数据,直到没有数据需要删除为止。您可以将脚本保存为一个文件,然后使用crontab定时执行。
oracle根据sql里面的创建时间来进行删除数据,每次限制10000条数据删除,通过shell来实现
可以回答这个问题。可以使用以下的shell脚本来实现:
```
#!/bin/bash
# 设置Oracle数据库连接信息
ORACLE_USER=username
ORACLE_PASSWORD=password
ORACLE_SID=database_sid
# 设置删除的时间范围
DELETE_DATE=$(date --date="30 days ago" +"%Y-%m-%d %H:%M:%S")
# 设置每次删除的数据量
DELETE_LIMIT=10000
# 执行删除操作
sqlplus -S $ORACLE_USER/$ORACLE_PASSWORD@$ORACLE_SID <<EOF
DELETE FROM table_name WHERE create_time < TO_DATE('$DELETE_DATE', 'YYYY-MM-DD HH24:MI:SS') AND ROWNUM <= $DELETE_LIMIT;
COMMIT;
EXIT;
EOF
```
这个脚本会连接到Oracle数据库,根据指定的时间范围和每次删除的数据量来删除数据。注意,需要将脚本中的`username`、`password`、`database_sid`和`table_name`替换为实际的值。
阅读全文