检查Oracle数据库是否已打开并准备就绪
首先。当然,我尝试过谷歌搜索,也看到过其他答案,但没有一个能帮到我 问题 我启动一台服务器,当它启动时,我想插入一个PDB。 要在插入新PDB之前等待DB初始化并打开,请运行脚本:检查Oracle数据库是否已打开并准备就绪,oracle,powershell,oracle19c,Oracle,Powershell,Oracle19c,首先。当然,我尝试过谷歌搜索,也看到过其他答案,但没有一个能帮到我 问题 我启动一台服务器,当它启动时,我想插入一个PDB。 要在插入新PDB之前等待DB初始化并打开,请运行脚本: for (; ; ) { $process = Start-Process "sqlplus" -ArgumentList "-S sys/Qq123456 as sysdba @$Env:INSTALL_DIR\$Env:SCRIPT_DIR\ping.sql" -Wait -PassThru
for (; ; )
{
$process = Start-Process "sqlplus" -ArgumentList "-S sys/Qq123456 as sysdba @$Env:INSTALL_DIR\$Env:SCRIPT_DIR\ping.sql" -Wait -PassThru
if ($process.ExitCode -eq 0)
{
Write-Output "DB started!"
break;
}
Start-Sleep -s 1
}
ping.sql:
WHENEVER SQLERROR EXIT SQL.SQLCODE;
declare
db_not_open exception;
pragma exception_init (db_not_open, -20123);
l_count number(10);
begin
select count(*) into l_count from v$instance where status = 'OPEN' and database_status = 'ACTIVE';
if (l_count = 0) then
RAISE db_not_open;
end if;
end;
/
exit 0;
然后我试着插上PDB
sqlplus-S/as sysdba“@$Env:INSTALL\u DIR\$Env:SCRIPT\u DIR\attach\u pdb.sql”
附加_pdb.sql:
WHENEVER SQLERROR EXIT SQL.SQLCODE;
create pluggable database test_pdb using 'c:\data\oracle\oradata\orcl\test_pdb\test_pdb.xml' nocopy tempfile reuse;
alter pluggable database test_pdb open;
exit;
因此,我循环直到DB状态打开并处于活动状态,但有时在尝试插入PDB时仍会出现错误:
create pluggable database test_pdb using 'c:\data\oracle\oradata\orcl\test_pdb\test_pdb.xml' nocopy tempfile reuse
*
ERROR at line 1:
ORA-01109: database not open
那么,谁来检查数据库是否已打开并准备好进行任何操作呢?我不知道正确的解决方案,但我使用这个ping脚本解决了这个问题:
WHENEVER SQLERROR EXIT SQL.SQLCODE;
declare
db_not_open exception;
pragma exception_init (db_not_open, -20123);
l_count number(10);
begin
select count(*) into l_count from v$instance where status = 'OPEN' and database_status = 'ACTIVE';
if (l_count = 0) then
RAISE db_not_open;
end if;
-- we have to be sure that simple operation is already possible
execute immediate '
CREATE PLUGGABLE DATABASE ping_pdb ADMIN USER ping_user identified by ping
DEFAULT TABLESPACE USERS
DATAFILE ''C:\data\oracle\oradata\ORCL\ping_pdb\users01.dbf''
SIZE 10M AUTOEXTEND ON
FILE_NAME_CONVERT=(
''C:\data\oracle\oradata\ORCL\pdbseed'',
''C:\data\oracle\oradata\ORCL\ping_pdb\''
)';
execute immediate 'drop pluggable database ping_pdb INCLUDING DATAFILES';
end;
/
exit 0;
这不是一个好的解决办法,但我没有想法。如果有更好的解决方案,请告诉我。我不知道正确的解决方案,但我使用以下ping脚本解决了此问题:
WHENEVER SQLERROR EXIT SQL.SQLCODE;
declare
db_not_open exception;
pragma exception_init (db_not_open, -20123);
l_count number(10);
begin
select count(*) into l_count from v$instance where status = 'OPEN' and database_status = 'ACTIVE';
if (l_count = 0) then
RAISE db_not_open;
end if;
-- we have to be sure that simple operation is already possible
execute immediate '
CREATE PLUGGABLE DATABASE ping_pdb ADMIN USER ping_user identified by ping
DEFAULT TABLESPACE USERS
DATAFILE ''C:\data\oracle\oradata\ORCL\ping_pdb\users01.dbf''
SIZE 10M AUTOEXTEND ON
FILE_NAME_CONVERT=(
''C:\data\oracle\oradata\ORCL\pdbseed'',
''C:\data\oracle\oradata\ORCL\ping_pdb\''
)';
execute immediate 'drop pluggable database ping_pdb INCLUDING DATAFILES';
end;
/
exit 0;
这不是一个好的解决办法,但我没有想法。如果有人有更好的解决方案,请告诉我。什么是Oracle版本?@wolφi我有最新的Oracle版本c19 EEE,但这不能回答您的问题,这能解决您的问题吗<代码>更改可插拔数据库测试\u pdb保存状态代码>@wolφi这不是我的情况。我使用安装了oracle db的windows docker。在开始时,我尝试下载PDB的一个实例,并附加它以对其进行一些测试。因此,每次它都是安装了oracle的全新服务器,我只是等待它准备就绪。oracle版本是什么?@wolφI我有最新的oracle版本c19 EEC,虽然这不是对您问题的回答,但这能解决您的问题吗<代码>更改可插拔数据库测试\u pdb保存状态代码>@wolφi这不是我的情况。我使用安装了oracle db的windows docker。在开始时,我尝试下载PDB的一个实例,并附加它以对其进行一些测试。所以每次它都是安装了oracle的全新服务器,我只是等待它准备好。