Проверьте Oracle база данных открыта и готова - PullRequest
1 голос
/ 08 апреля 2020

Прежде всего. Конечно, я пытался гуглить и видел другие ответы, но ни один из них мне не помог.

Проблема Я запускаю сервер, и когда он запускается, я хочу подключить PDB , Чтобы дождаться инициализации и открытия БД, прежде чем подключать новую PDB, я запускаю скрипт:

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_DIR\$Env:SCRIPT_DIR\attach_pdb.sql" attach_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;

Таким образом, я l oop, пока у меня не открыто и активно состояние БД, но все равно иногда я получаю сообщение об ошибке при попытке подключить 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

Итак, кто проверяет, что БД открыта и готова к любой операции?

1 Ответ

0 голосов
/ 08 апреля 2020

Я не знаю правильного решения, но я решил это с помощью сценария 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;

Это не очень хорошее решение, но у меня нет идей. Если у кого-то есть лучшие решения, пожалуйста, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...