在构建新的备用数据库时,是否可以让它在备用数据库上没有数据文件的情况下开始从主数据库传送归档日志?
Leigh Riffel's questions
对于我几乎所有的数据库,当我运行一条SELECT
语句时,显示的列的长度会调整为被查询数据的宽度。但是,我有两个数据库(同一应用程序的开发和生产)似乎将所有列大小默认为 32 个字符宽。如果数据宽于 32 个字符或使用了列别名,则默认该列为 128 个字符宽。
以下是来自众多优秀系统之一的一些示例:
>select '1234567890' XX_Identifier from dual;
XX_IDENTIF
----------
1234567890
>select '12345678901234567890' XX_Identifier from dual;
XX_IDENTIFIER
--------------------
12345678901234567890
以下是其中一个不良系统的一些示例:
>select '1234567890' XX_Identifier from dual;
XX_IDENTIFIER
--------------------------------
1234567890
>select '12345678901234567890' XX_Identifier from dual;
XX_IDENTIFIER
--------------------------------
12345678901234567890
我检查了 sqlplus 设置,它们都是一样的。我没有看到任何看起来不寻常的数据库参数,它们都具有相同的 NLS 参数。两个数据库使用相同的字符集。
我意识到我可以为要查询的每一列定义一种格式,但这不是必需的,因为它不在任何其他数据库上。
有这个问题的数据库是11.2.0.1,而我们其他的都是11.2.0.4,所以可能有一个我找不到的错误。在这两种情况下,我使用的 sqlplus 客户端都是 12.1.0.1。
更新:症状不完全匹配,但 Doc ID 330717.1 谈到了 sqlplus 中的列宽,基本上说如果不设置格式就不能保证任何事情。我可以接受,但由于行为是一致的,似乎可以确定原因。
在 Oracle 中,当您尝试删除正在使用的全局临时表时,会出现以下异常:
ORA-14452: 尝试在已使用的临时表上创建、更改或删除索引
这是由在当前事务中使用 GTT 的会话引起的。有没有办法查询数据字典以确定哪些会话阻止了丢弃?我知道我可以通过这样的方式获得正在进行的交易的会话,但我想进一步缩小范围。
select * from v$session
where session_id in (select session_id from dba_locks where lock_type='Transaction');
当RMAN DUPLICATE
从备份连接到目标时,如果没有until time
设置,复制使数据库的当前状态如何?
我在文档中能找到的最接近的内容是以下声明:
还原和复制重复的数据文件,并使用增量备份和归档重做日志文件将它们恢复到非当前时间点。
这个非当前时间点有多当前?它是否适用于它在副本开始时可用的所有存档日志,或者它们是否可能仅在它到达副本的恢复部分时才可用?
我有一个生成 XMLTYPE 的过程,我想根据模式验证它。问题是运行 createSchemaBasedXML 似乎存在权限问题,因为当我以 AUTHID DEFINER 身份运行该过程时,它给出了错误“ORA-31050:访问被拒绝”,但是当我以 AUTHID CURRENT_USER 身份运行它时,它实际上返回了一个特定于验证的错误(我会单独处理)。CURRENT_USER 不是可接受的解决方案。
我的假设是 CURRENT_USER 起作用是因为用户具有 XMLADMIN 角色。授予角色包含的权限并不能解决问题,因此一定是角色能够绕过 ACL。
问题是,在 RESOURCE_VIEW 中查询保护资源的 ACL 表明它受/sys/acls/all_owner_acl.xml
. DBMS_XDB.getPrivileges
显示 xsd 具有以下所有权限:
<read-properties/>
<read-contents/>
<write-config/>
<link/>
<unlink/>
<read-acl/>
<write-acl-ref/>
<update-acl/>
<resolve/>
<link-to/>
<unlink-from/>
<dav:lock/>
<dav:unlock/>
<dav:write-properties/>
<dav:write-content/>
<dav:execute/>
<dav:take-ownership/>
<dav:read-current-user-privilege-set/>
UsingDBMS_XDB.getAclDocument
表明主体dav:owner
拥有所有权限,因此这不足以让架构所有者创建基于架构的 XML。考虑到这个想法,我创建了一个块来运行DBMS_XDB.createResource
创建一个新的 ACL。我可以成功创建 ACL,并且从 SQLDeveloper 我可以看到它存在于我创建它的位置。
在此过程中有很多地方我可能会出错,所以我要寻找的核心是:
必须采取什么措施来根据模式验证 XMLTYPE?
=== 更新 4/3/2013 ===
我可以将我的 xsd 文件的 acl 设置/sys/acls/all_all_acl.xml
为/sys/acls/all_owner_acl.xml
. 和以前一样,这些都不能解决权限问题。我还尝试使用从 all_owner_acl.xl 复制的 acl 定义并使用与 /sys/acls/ 的那些文件相同的路径来创建资源。这至少成功地设置了 ACL。我已经为我的所有 XSD 运行它并查询 RESOURCE_VIEW 以确认它们已设置为新的 ACL。尽管如此,createSchemaBasedXML 仍然给出拒绝访问错误。我的 ACL 是否正确或可能存在其他问题?
<acl xmlns="http://xmlns.oracle.com/xdb/acl.xsd"
xmlns:dav="DAV:"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.oracle.com/xdb/acl.xsd
http://xmlns.oracle.com/xdb/acl.xsd" shared="true">
<ace>
<grant>true</grant>
<principal>MY_ORACLE_USER</principal>
<privilege>
<all/>
</privilege>
</ace>
</acl>
=== 2013 年 4 月 9 日更新 ===
我有一个匿名块,可以根据模式成功验证 XML。这再次指向一个权限问题,该问题允许它在启用角色时起作用,但在角色不可用时不起作用。
== 2013 年 4 月 12 日更新 ===
我得到的每一点证据似乎都表明我的 ACL 有问题,或者更有可能是我设置 ACL 的方式有问题。将 XDBADMIN 角色从用户那里拿走会导致匿名块失败并出现访问被拒绝错误,即使我已经授予该角色根据 dba_tab_privs 提供的所有权限。我的 setACL 遵循这种形式:
DBMS_XDB.setACL('/sys/schemas/MY_ORACLE_USER/account.xsd', '/sys/acls/acl_acc.xml');
可以在Oracle Communities上找到完整的测试用例。
单元测试需要 dbms_scheduler 作业在运行单元测试的同一 RAC 节点上运行。我知道,对于管理员管理的数据库,这可以通过创建一个限制可用实例的服务,然后在作业使用的作业类中使用该服务来完成。我的问题是,如何在 11.2 中通过策略管理来做到这一点?
可以创建只有一个服务器的池,并且可以将数据库分配给多个池,但据我了解,一台服务器只能分配给一个池。因此,无法创建使用单个服务器的服务,并且仍然有其他服务使用由多个服务器(包括该服务器)定义的池。
我也知道可以将服务创建为 SINGLETON 或 UNIFORM,但由于 SIGNLETON 不提供允许的服务器,甚至不提供首选服务器,我不确定这将有何帮助。
当然,我错过了使这一切成为可能的东西。
我有一些使用 DBMS_XMLSCHEMA 注册的 XML 模式定义。我已经使用生成的 XMLTypes 创建了表。我可以使用 XMLQuery 创建 XML,如果我理解正确,如果定义正确,可以将查询结果插入到表中。
最终需要将 XML 写入文件,但我不确定的部分是从头开始编写 XMLQueries 是否是生成 XML 的最佳方式。有没有办法让 XML 模式为指南生成 XML 存根或生成模板 XMLQuery?数据目前都在常规 Oracle 表中,但排列方式完全不同,因此任何有关基于一组特定注册模式轻松导出到 XML 的信息都会很有用。
当一个包有状态并且头部改变时,第一次调用会得到一个错误堆栈,如下所示:
ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package "LRIFFEL.PKG1" has been invalidated
ORA-04065: not executed, altered or dropped package "LRIFFEL.PKG1"
ORA-06508: PL/SQL: could not find program unit being called: "LRIFFEL.PKG1"
ORA-06512: at "LRIFFEL.PKG2", line 7
ORA-06512: at line 1
来自同一会话的后续调用会重新初始化包状态并因此成功运行。有趣的是,当调用者捕获异常并执行 raise_application_error 时,这种行为似乎发生了变化。正如预期的那样,raise_application_error 包含在堆栈中,但与预期相反,ORA-04068 没有。这是一个示例错误堆栈:
ERROR at line 1:
ORA-20001: Failed
ORA-06512: at "LRIFFEL.PKG2", line 7
ORA-04061: existing state of package "LRIFFEL.PKG1" has been invalidated
ORA-04065: not executed, altered or dropped package "LRIFFEL.PKG1"
ORA-06508: PL/SQL: could not find program unit being called: "LRIFFEL.PKG1"
ORA-06512: at line 1
这似乎不仅仅是一个显示问题,因为重复调用该过程继续得到相同的错误。只有当将 raise_application_error 转换回简单的 raise(或完全消除异常块)时,下一次执行才会包含 ORA-04068,并且下一次执行成功。
任何人都可以确认和/或解释这种行为吗?这是重现该行为的方法:
--Session 1 - Create Objects
create or replace package pkg1 as
vInteger Integer := 7;
procedure procA;
end;
/
create or replace
package body pkg1 as
procedure procA is
begin
DBMS_Output.Put_Line('ProcA');
end;
end;
/
create or replace
package pkg2 as
procedure procB;
end;
/
create or replace
package body pkg2 as
procedure procB is
begin
pkg1.procA;
exception
when others then
raise;
end;
end;
/
--Session 2 - Test execution.
execute pkg2.procB;
--Session 1 - Change package header and thus invalidate package state.
create or replace package pkg1 as
vInteger Integer := 8;
procedure procA;
end;
/
--Session 2 - Observe failure due to changed package state.
execute pkg2.procB;
--Session 2 - Observe success due to re-initialized package state.
execute pkg2.procB;
--Session 1 - Change Raise to Raise_Application_Error.
create or replace
package body pkg2 as
procedure procB is
begin
pkg1.procA;
exception
when others then
raise_application_error(-20001,'Failed',True);
end;
end;
/
--Session 1 - Change package header and thus invalidate package state.
create or replace package pkg1 as
vInteger Integer := 9;
procedure procA;
end;
/
--Session 2 - Observe failure due to changed package state.
execute pkg2.procB;
--Session 2 - Observe unexpected continued failures.
execute pkg2.procB;
execute pkg2.procB;
execute pkg2.procB;
execute pkg2.procB;
execute pkg2.procB;
execute pkg2.procB;
execute pkg2.procB;
--Session 1 - Change back to raise.
create or replace
package body pkg2 as
procedure procB is
begin
pkg1.procA;
exception
when others then
raise;
end;
end;
/
--Session 2 - Observe failure on the first execution.
execute pkg2.procB;
--Session 2 - Observe success.
execute pkg2.procB;
除了涉及触发器之外,错误 229349 看起来很相似。
Oracle 文档在 11.2 Performance Tuning Guide 中有一节,标题为Determining which Segments have many Buffers in the Pool。该部分列出了以下查询:
SELECT o.OBJECT_NAME, COUNT(*) NUMBER_OF_BLOCKS
FROM DBA_OBJECTS o, V$BH bh
WHERE o.DATA_OBJECT_ID = bh.OBJD AND o.OWNER != 'SYS'
GROUP BY o.OBJECT_NAME
ORDER BY COUNT(*);
如果我们将其更改为右连接,我们会从 v$bh 中获取行,而不管 dba_objects 中是否存在匹配的 object_id。
SELECT o.OBJECT_NAME, COUNT(*) NUMBER_OF_BLOCKS
FROM DBA_OBJECTS o, V$BH bh
WHERE o.DATA_OBJECT_ID(+) = bh.OBJD AND o.DATA_OBJECT_ID IS NULL
GROUP BY o.OBJECT_NAME
ORDER BY COUNT(*);
我的问题是这些行代表什么?它们有 file#、block# 和 objd 列,但 dba_objects 中不存在 objd 值。我转储了其中一个块,它似乎包含一个索引,但我无法说出任何关于它的信息。v$bh 中有很多行匹配 dba_objects 中的索引,因此不匹配的 v$bh 行不能因为它们是索引块而不匹配。一定有别的事情发生。
我的一个系统上有更多不匹配的对象,但它们都有不匹配的对象,包括 11.2.0.2.6 系统。
更新:
对于不匹配对象最多的系统,在将 bh.objd 与 obj$ 中的 dataobj# 字段进行比较时,可以匹配大部分。我不确定为什么这些对象没有反映在 dba_objects 中,但也许对视图的检查(或单独的问题)会回答这个问题。
对于剩余的 391 个未识别条目,这里是一些其他感兴趣的信息。
SELECT class#, count(class#) FROM v$bh bh
WHERE NOT EXISTS (SELECT 1 FROM obj$ o2 WHERE o2.dataobj# = bh.objd)
GROUP BY class#
4 HAVING count(class#) > 1;
CLASS# COUNT(CLASS#)
---------- -------------
12 59
13 36
18 15
20 20
22 25
30 12
32 6
36 28
38 3
42 16
44 125
CLASS# COUNT(CLASS#)
---------- -------------
52 4
12 rows selected.
我只用一个条目消除了类值。其中有33个。
SELECT status, count(status) FROM v$bh bh
WHERE NOT EXISTS (SELECT 1 FROM obj$ o2 WHERE o2.dataobj# = bh.objd)
GROUP BY status;
STATUS COUNT(STATUS)
------- -------------
xcur 361
1 row selected.
有没有办法告诉VALIDATE RECOVERY FILES
命令使用具有更多可用磁盘空间的不同位置?
当我在 RMAN 中运行该命令时,它失败并出现以下错误堆栈:
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: failure of validate command on ORA_DISK_1 channel at 06/05/2012 12:02:42
ORA-19502: write error on file "/opt/app/oracle/product/11.2.0/dbhome_1/dbs/...
ORA-27072: File I/O error
Additional information: 4
Additional information: 1071488
Additional information: 286720
ORA-19502: write error on file "/opt/app/oracle/product/11.2.0/dbhome_1/dbs/...
这似乎是由于验证正在使用数据库主页作为其工作区,而那里没有足够的磁盘空间。在命令失败并返回空间之前,我实际上可以看到那里的 8GB 可用空间降为零。
在为设备分配通道时,该位置不受格式中设置位置的影响。
DB_RECOVERY_FILE_DEST 设置为“+FRA”,但目前大多数备份位于 /u01/back 而不是 ASM。'+FRA' 确实有一些控制文件备份。
更新:
我还没有找到一种方法来做到这一点,但我也没有找到任何明确的说法,说这是不可能的。有一个Oracle 社区主题对此进行了讨论,但没有解决方案。有趣的是RESTORE ARCHIVELOG ALL VALIDATE
并RESTORE VALIDATE DATABASE CHECK LOGICAL
没有表现出这种行为,这可能就是为什么更多人没有遇到过它的原因。
更新 2:
我在 Oracle 支持下打开了一个 SR,看看他们是否可以阐明这个问题。
更新 3:
Oracle 支持能够在内部重现此问题,他们将其视为错误。
有没有办法在数据泵导出参数文件中添加注释?
在进行升级或修补之前关闭数据库可以通过多种方式完成。
shutdown immediate;
或者
shutdown abort;
startup restrict;
shutdown immediate;
或者
shutdown abort;
startup restrict;
shutdown;
或者
alter system checkpoint;
shutdown abort;
startup restrict;
shutdown immediate;
当然还有其他选择。哪个应该是首选,为什么?
有时我会得到一个脚本,它可以在 SQL Developer 或 Toad 中正常运行,但需要修改才能从 SQL*Plus 成功运行。这是一个包含多个语句的最坏情况示例,每个语句都带有空行、分号和正斜杠:
INSERT INTO t1 VALUES ('a
;
/
');
INSERT INTO t1 VALUES ('b
;
/
');
DELETE FROM t1 WHERE c1 = 'c
;
/
';
由于各种原因,这些语句需要从 SQL*Plus 运行。空白行很容易用一个简单的...
set sqlblanklines on
我知道sqlterminator
可以更改和/或关闭,但两者都需要修改代码,前者移动了问题而不解决它,也没有解决嵌入式斜杠问题。
最好的答案是通过以某种方式更改环境(如 sqlblanklines 所做的那样),允许这些语句在不修改的情况下运行。如果那是不可能的,那么也许有一种方法可以以编程方式修改脚本。我试图避免手动更改。
根据此数据(假设行数事先未知):
with q1 as (select mod(ora_hash(level),5) c1 from dual connect by level <=4)
select * from q1;
/*
C1
--
2
1
4
1
*/
我想要所有行中 c1 列的乘积。类似于 SUM(c1) 的结果,我只希望每个值乘以其他值而不是相加。在这种情况下,这将是 2 * 1 * 4 * 1 = 8。
/*
X1
--
8
*/
数据可以包含负数和零,可以使用以下方法模拟:
with q1 as (select mod(ora_hash(level),5)-1 c1 from dual connect by level <=4)
select * from q1;
或者
with q1 as (select mod(ora_hash(level),5)-3 c1 from dual connect by level <=4)
select * from q1;
我知道这可以通过自定义聚合函数来完成,但我对本机方法很感兴趣。
我看到开发人员使用隐式日期转换的代码。我想要一个明确的答案,说明他们为什么不应该这样做。
SELECT * from dba_objects WHERE Created >= '06-MAR-2012';
如果我使用DBMS_Profiler来分析一个长时间运行(5 小时)的 PL/SQL 脚本,我应该期望脚本运行多长时间进行分析?我意识到这将取决于脚本在做什么,但一般来说我是在看秒、分钟还是更多?
我们有一个性能不佳的查询。可以使用仅访问一个索引以从八行中检索一列(索引列)的简单查询来重现问题的根源。
该表没有统计信息,但索引有。在索引上收集新的统计数据并没有改变计划,但在表上收集统计数据却改变了。我的理解是,仅使用索引就可以满足的查询不必访问表,因此我的心智模型是表统计信息在这种情况下无关紧要,但经验似乎表明并非如此。
解释计划和自动跟踪计划都只显示索引访问,但是当表统计信息不存在时,成本和基数会显着增加。自动跟踪显示更高的 CPU、数据库时间和一致获取。我还没有尝试跟踪它,但我可以通过在表中创建/删除统计信息来重现它,如下所示。谁能解释这种行为?
set serveroutput on
DECLARE
numr NUMBER;
numb NUMBER;
avgr NUMBER;
nrow NUMBER;
nblk NUMBER;
numd NUMBER;
avgl NUMBER;
avgd NUMBER;
cfac NUMBER;
ilvl NUMBER;
gues NUMBER;
BEGIN
--Gather Stats.
dbms_stats.Gather_table_Stats(USER,'RESULTS');
--Gather Index Stats.
dbms_stats.Gather_index_Stats(USER,'I1');
--Show Index Stats.
dbms_stats.get_index_stats(USER, 'I1', NULL, NULL, NULL, nrow, nblk
, numd, avgl, avgd, cfac, ilvl, NULL, gues);
dbms_output.put_line('Number of rows: ' || TO_CHAR(nrow));
dbms_output.put_line('Number of blocks: ' || TO_CHAR(nblk));
dbms_output.put_line('Distinct keys: ' || TO_CHAR(numd));
dbms_output.put_line('Avg leaf blocks/key: ' || TO_CHAR(avgl));
dbms_output.put_line('Avg data blocks/key: ' || TO_CHAR(avgd));
dbms_output.put_line('Clustering factor: ' || TO_CHAR(cfac));
dbms_output.put_line('Index level: ' || TO_CHAR(ilvl));
dbms_output.put_line('IOT guess quality: ' || TO_CHAR(gues));
delete from plan_table;
END;
/
EXPLAIN PLAN FOR SELECT rsample_id FROM results
WHERE rsample_id = '0555103360';
SELECT cost, substr(lpad(' ', level-1) || operation || ' (' || options
|| ')',1,50 ) "Operation", object_name "Object"
FROM plan_table START WITH ID = 0 CONNECT BY PRIOR id=parent_id;
DECLARE
nrow NUMBER;
nblk NUMBER;
numd NUMBER;
avgl NUMBER;
avgd NUMBER;
cfac NUMBER;
ilvl NUMBER;
gues NUMBER;
BEGIN
--Delete Stats.
dbms_stats.delete_table_stats(USER,'RESULTS');
--Gather Index Stats.
dbms_stats.Gather_index_Stats('LRIFFEL','I1');
--Show Index Stats.
dbms_stats.get_index_stats(USER, 'I1', NULL, NULL, NULL, nrow, nblk
, numd, avgl, avgd, cfac, ilvl, NULL, gues);
dbms_output.put_line('Number of rows: ' || TO_CHAR(nrow));
dbms_output.put_line('Number of blocks: ' || TO_CHAR(nblk));
dbms_output.put_line('Distinct keys: ' || TO_CHAR(numd));
dbms_output.put_line('Avg leaf blocks/key: ' || TO_CHAR(avgl));
dbms_output.put_line('Avg data blocks/key: ' || TO_CHAR(avgd));
dbms_output.put_line('Clustering factor: ' || TO_CHAR(cfac));
dbms_output.put_line('Index level: ' || TO_CHAR(ilvl));
dbms_output.put_line('IOT guess quality: ' || TO_CHAR(gues));
delete from plan_table;
END;
/
EXPLAIN PLAN FOR SELECT rsample_id FROM results
WHERE rsample_id = '0555103360';
SELECT cost, substr(lpad(' ', level-1) || operation || ' (' || options
|| ')',1,50 ) "Operation", object_name "Object"
FROM plan_table START WITH ID = 0 CONNECT BY PRIOR id=parent_id;
这有以下输出(修改以适合):
anonymous block completed
Number of rows: 125226611
Number of blocks: 381090
Distinct keys: 5778886
Avg leaf blocks/key: 1
Avg data blocks/key: 3
Clustering factor: 19792294
Index level: 3
IOT guess quality:
plan FOR succeeded.
COST Operation Object
----- --------------------- ------
4 SELECT STATEMENT()
4 INDEX (RANGE SCAN) I1
anonymous block completed
Number of rows: 119034073
Number of blocks: 362402
Distinct keys: 5353024
Avg leaf blocks/key: 1
Avg data blocks/key: 3
Clustering factor: 18852918
Index level: 3
IOT guess quality:
plan FOR succeeded.
COST Operation Object
----- --------------------- ------
9 SELECT STATEMENT()
9 INDEX (RANGE SCAN) I1
创建这个之后,我注意到每次运行的索引统计信息都是不同的,即使表中没有任何更改并且索引统计信息在每次运行时重新收集。我现在的理论是,在使用级联选项收集表统计信息时,即使重新收集索引统计信息,也会保留索引统计信息中的某些内容。
Granularity 设置为 AUTO,Cascade 设置为 AUTO_CASCADE。
我们 RAC 系统上的企业管理器作业最近开始间歇性地初始化失败并出现以下错误:
评估参数源/安全检查/锁定时出错 ORA-06508: PL/SQL: 找不到被调用的程序单元
我们尝试过反弹 DBConsole,从库中重新提交作业,甚至重新编译被引用的包。这发生在多个作业中,每十个计划成功执行一次。关于可以尝试或检查什么的任何想法?
更新:我已经用 Oracle 开了一个 SR。
根据 Oracle 的说法, Oracle 的Configuration Manager提供了“40% 更快的问题解决”,是否违反HIPAA或需要特定配置才能遵守?
这个问题涉及包含受保护医疗保健信息 (PHI) 的数据库。问题范围仅涵盖 OCM 而不是更广泛的 Oracle 支持访问数据库的范围。
以下来自 Oracle的内容描述了 OCM 收集的内容:
Oracle Configuration Manager 可以自动收集 Oracle 产品安装的配置信息,并将这些信息上传到 Oracle 的支持系统。Oracle Configuration Manager 收集的配置信息包括:
• 安装的补丁
• 部署平台、日期、版本和类型
• 部署的组件和应用程序
• 配置文件的内容
• 关于网络配置的信息请注意,Oracle Configuration Manager 收集的信息仅限于配置信息。该实用程序不收集敏感数据,例如实际客户数据(即配置信息以外的任何数据,包括实际应用程序或数据库事务)、密码哈希值、登录事件等。My Oracle Support 说明728985.1提供了所有的列表Oracle Configuration Manager 收集的数据。
根据hss.gov,以下信息受 HIPAA 保护:
隐私规则保护涵盖实体或其业务伙伴以任何形式或媒体(无论是电子的、纸质的还是口头的)持有或传输的所有“可识别个人身份的健康信息”。隐私规则称此信息为“受保护的健康信息 (PHI)”。 12
“可识别个人身份的健康信息”是指与以下相关的信息,包括人口统计数据:
• 个人过去、现在或未来的身体或心理健康或状况,
• 向个人提供的医疗保健,或
• 过去、现在或将来为向个人提供医疗保健而支付的费用,并且可以识别个人身份或有合理依据相信它可以用来识别个人身份的信息。13 可识别个人身份的健康信息包括许多常见的标识符(例如,姓名、地址、出生日期、社会安全号码)。