当我们配置 Data Guard 时,我们会启用强制日志记录。如果我们设置手动复制(通过 rsync 并在目标位置编录档案 + 数据库恢复),我们是否也需要启用强制日志记录?
我每天都会备份我的测试系统,包括每日完整备份和每小时的 arch 备份。我需要将其中一个备份还原到另一台 Linux 服务器。我已完成还原数据库(数据库处于挂载模式)之前的所有步骤。以下是我的备份列表:
RMAN> list backup of database summary;
List of Backups
===============
Key TY LV S Device Type Completion Time #Pieces #Copies Compressed Tag
------- -- -- - ----------- --------------- ------- ------- ---------- ---
8729 B 0 A DISK 21-JUN-24 1 1 YES DATABASE_BKP
8731 B 0 A DISK 21-JUN-24 1 1 YES DATABASE_BKP
8732 B 0 A DISK 21-JUN-24 1 1 YES DATABASE_BKP
8733 B 0 A DISK 21-JUN-24 1 1 YES DATABASE_BKP
8734 B 0 A DISK 21-JUN-24 1 1 YES DATABASE_BKP
8735 B 0 A DISK 21-JUN-24 1 1 YES DATABASE_BKP
8736 B 0 A DISK 21-JUN-24 1 1 YES DATABASE_BKP
8737 B 0 A DISK 21-JUN-24 1 1 YES DATABASE_BKP
8784 B 0 A DISK 22-JUN-24 1 1 YES DATABASE_BKP
8786 B 0 A DISK 22-JUN-24 1 1 YES DATABASE_BKP
8787 B 0 A DISK 22-JUN-24 1 1 YES DATABASE_BKP
8788 B 0 A DISK 22-JUN-24 1 1 YES DATABASE_BKP
8789 B 0 A DISK 22-JUN-24 1 1 YES DATABASE_BKP
8790 B 0 A DISK 22-JUN-24 1 1 YES DATABASE_BKP
8791 B 0 A DISK 22-JUN-24 1 1 YES DATABASE_BKP
8792 B 0 A DISK 22-JUN-24 1 1 YES DATABASE_BKP
8840 B 0 A DISK 23-JUN-24 1 1 YES DATABASE_BKP
8842 B 0 A DISK 23-JUN-24 1 1 YES DATABASE_BKP
8843 B 0 A DISK 23-JUN-24 1 1 YES DATABASE_BKP
8844 B 0 A DISK 23-JUN-24 1 1 YES DATABASE_BKP
8845 B 0 A DISK 23-JUN-24 1 1 YES DATABASE_BKP
8846 B 0 A DISK 23-JUN-24 1 1 YES DATABASE_BKP
8847 B 0 A DISK 23-JUN-24 1 1 YES DATABASE_BKP
8848 B 0 A DISK 23-JUN-24 1 1 YES DATABASE_BKP
我如何恢复到 6 月 22 日或 21 日?列表中的所有备份都位于同一文件夹中
刚开始学习 Oracle,我需要恢复数据库备份。日志文件显示它是在 Oracle Database 10g Enterprise 中生成的。我有 Oracle XE 18,是否可以使用 RMAN 或其他工具将其制作为 XE 版本?以下是我存档中的文件列表。
> configFFH.ora
> ffdacs-nfs-backup-2024-06-17.tar.gz
> initFFH.ora
> ffhbackup
> arch_1_56543.arc
> arch_1_56544.arc
> arch_1_56545.arc
> arch_1_56546.arc
> arch_1_56547.arc
> arch_1_56548.arc
> arch_1_56549.arc
> arch_1_56550.arc
> arch_1_56551.arc
> arch_1_56552.arc
> arch_1_56553.arc
> control01.ctl
> dcomm.cache
> ffhactivity01.dbf
> ffhactivity_idx01.dbf
> ffhactivity_idx02.dbf
> ffhbackup2.log
> ffhconfig01.dbf
> ffhconfig02.dbf
> ffhconfig03.dbf
> ffhconfig04.dbf
> ffhdetail01.dbf
> ffhdetail_idx01.dbf
> ffhsummary01.dbf
> ffhsummary_idx01.dbf
> FFH_backup.log
> fsdump
> hot_db_files.lst
> sysaux01.dbf
> sysaux02.dbf
> system01.dbf
> temp01.dbf
> undo.dbf
Oracle 的DBMS_ADVANCED_REWRITE 文档页面解释了如何声明查询重写并删除它们,但没有解释如何列出数据库中所有声明的重写。
是否可以列出所有声明的重写?
我正在寻找方法来提高数据库对于繁重的分析查询的性能,并发现我的临时表空间有 1M 范围(统一表空间的默认值)。由于我通常的临时表空间使用量远高于每个查询 1GB(具有大量连接/排序/组的顶级查询可能消耗多达 100 GB 的临时表空间),1M 范围对我来说看起来太低了。为了性能而增加范围大小是否值得?
这可能是缺乏理解,因为我更像是 MSSQL DBA,而不是 Oracle。
我们在 Amazon 的 RDS 上运行 Oracle。引擎版本 19.0.0.0.ru-2020-10.rur-2020-10.r1
我删除了一个旧的 _backup 表,但没有指定清除选项,该表不在回收站中,但空间尚未从数据库中回收。
我已经运行了以下命令,但未返回任何行:
SELECT * FROM RECYCLEBIN;
SELECT * FROM DBA_RECYCLEBIN;
SELECT * FROM USER_RECYCLEBIN;
甚至尝试过(在测试备份上)命令 PURGE 'TABLENAME',但由于它不在回收站中,因此失败了。我以 ROOT 用户身份登录,不确定这是否会有所不同。
欢迎任何建议或指导。
我有一个Oracle 19c数据库(版本号19.0.0.0.0),以及两个具有许多列的表,这里只列出相关的列:
表1:
- createtime 日期
- contact_key 字符型(96字节)
表2:
- contact_key 字符型(96字节)
- csi_tfid 可变字符型(300字节)
表1有2.1亿行数据,并且是按年度分区的。表2有680万条记录,没有分区。
以下查询运行得非常快,大约在0.05到0.1秒之间:
SELECT * FROM 表1 m, 表2 c
WHERE
c.contact_key = m.contact_key
AND c.csi_tfid = '1234567';
但是,一旦我添加一个条件来仅获取最后几条记录(这对应用程序来说是相关的),执行速度就会下降到1分钟,甚至更慢:
SELECT * FROM 表1 m, 表2 c
WHERE
c.contact_key = m.contact_key
AND c.csi_tfid = '1234567'
AND m.createtime >= (SYSDATE-30);
我尝试使用硬编码的日期,如TO_DATE('2024-04-09', 'YYYY-MM-DD')
,结果相同。
我在查询中所有列上都有单独的索引:
表1:
- ik_table1_contact_k 非唯一
- ik_table1_createtime 非唯一
表2:
- ik_table2_contact_key 唯一
- ik_table2_csi_tfid 非唯一
我尝试在两个表上添加复合索引,包括contact_key和createtime(对于表1)以及contact_key和csi_tfid(对于表2),但似乎没有效果。
对于快速查询,Oracle生成了这个执行计划:
计划哈希值:323565418
-----------------------------------------------------------------------------------------------------------------------------------
| 编号 | 操作 | 名称 | 行数 | 字节 | 成本(%CPU) | 时间 | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 1857 | 118 (0)| 00:00:01 | | |
| 1 | NESTED LOOPS | | 3 | 1857 | 118 (0)| 00:00:01 | | |
| 2 | TABLE ACCESS BY INDEX ROWID BATCHED | 表2 | 3 | 966 | 7 (0)| 00:00:01 | | |
|* 3 | INDEX RANGE SCAN | IK_TABLE2_CSI_TFID | 3 | | 3 (0)| 00:00:01 | | |
| 4 | PARTITION RANGE ALL | | 1 | 297 | 37 (0)| 00:00:01 | 1 | 12 |
| 5 | TABLE ACCESS BY LOCAL INDEX ROWID BATCHED | 表1 | 1 | 297 | 37 (0)| 00:00:01 | 1 | 12 |
|* 6 | INDEX RANGE SCAN | IK_TABLE1_CONTACT_K | 1 | | 36 (0)| 00:00:01 | 1 | 12 |
-----------------------------------------------------------------------------------------------------------------------------------
Predicate Information (通过操作ID识别):
---------------------------------------------------
3 - access("C"."CSI_TFID"='1234567')
6 - access("C"."CONTACT_KEY"="M"."CONTACT_KEY")
对于带有createtime条件的慢查询,执行计划有很大不同:
计划哈希值:1504517877
-------------------------------------------------------------------------------------------------------------------------------------
| 编号 | 操作 | 名称 | 行数 | 字节 | 成本(%CPU)
目前,我正在使用以下代码片段逐列索引:
DECLARE
already_exists EXCEPTION;
columns_indexed EXCEPTION;
PRAGMA EXCEPTION_INIT ( already_exists, -955 );
PRAGMA EXCEPTION_INIT (columns_indexed, -1408);
BEGIN
EXECUTE IMMEDIATE 'Create Index TABLE_A_COLUMN_A on TABLE_A(COLUMN_A)';
EXCEPTION
WHEN already_exists or columns_indexed
THEN
NULL;
END;
COLUMN_A
这段代码可以替换吗
a) 使用列表引用并动态迭代它?
declare @myList varchar(100)
set @myList = 'COLUMN_A,COLUMN_B,COLUMN_C'
b) 并确保循环即使遇到一列问题也能保持循环?换句话说,如果其中一列出现问题,则整个循环不应失败
我的数据库处于挂载状态,我们执行了数据库备份。
backup database format '/backup/db_full%U.bkp';
所以,当恢复它时,我不能简单地使用:
Restore database;
alter database open;
表明
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 1 needs media recovery
ORA-01110: data file 1: '+DATA/orcl/datafile/system.257.1161421855'
为什么我还需要恢复数据库?我知道当数据库打开并且我们执行一些备份时,我们必须恢复,因为备份不一致,但在这种情况下,执行备份时数据库处于挂载状态。我不想恢复,因为我不想在备份后应用所有更改。
编辑: 我在 Oracle 19c 文档中发现备份选项“一致”。
backup consistent database format '/backup/db_full%U.bkp';
但仍然重新查询恢复(并且备份是在挂载状态下执行的)。