blob: 2578b607b120bf1272ba38d21e456c5b1eb99bde [file] [log] [blame]
ij> --
-- Licensed to the Apache Software Foundation (ASF) under one or more
-- contributor license agreements. See the NOTICE file distributed with
-- this work for additional information regarding copyright ownership.
-- The ASF licenses this file to You under the Apache License, Version 2.0
-- (the "License"); you may not use this file except in compliance with
-- the License. You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
--
-- This script tests online backup functionality
-- 1) in a non-idle tranaction.
-- 2) mutiple backup calls on the same connection.
-- 3) when unlogged operations are running in parallel
-- to the backup thread.
connect 'wombat' as c1 ;
ij(C1)> create procedure sleep(t BIGINT) dynamic result sets 0
language java external name 'java.lang.Thread.sleep'
parameter style java;
0 rows inserted/updated/deleted
ij(C1)> create function fileExists(fileName varchar(128))
returns VARCHAR(100) external name
'org.apache.derbyTesting.functionTests.util.FTFileUtil.fileExists'
language java parameter style java;
0 rows inserted/updated/deleted
ij(C1)> create function removeDirectory(fileName varchar(128))
returns VARCHAR(100) external name
'org.apache.derbyTesting.functionTests.util.FTFileUtil.removeDirectory'
language java parameter style java;
0 rows inserted/updated/deleted
ij(C1)> autocommit off;
ij(C1)> create table t1(a int ) ;
0 rows inserted/updated/deleted
ij(C1)> insert into t1 values(1) ;
1 row inserted/updated/deleted
ij(C1)> insert into t1 values(2) ;
1 row inserted/updated/deleted
ij(C1)> commit ;
ij(C1)> -- make sure backup calls are not allowed in a transaction that
-- has executed unlogged operations before the backup calls.
insert into t1 values(3);
1 row inserted/updated/deleted
ij(C1)> create index idx1 on t1(a);
0 rows inserted/updated/deleted
ij(C1)> call SYSCS_UTIL.SYSCS_BACKUP_DATABASE('extinout/mybackup') ;
ERROR XSRSB: Backup cannot be performed in a transaction with uncommitted unlogged operations.
ij(C1)> call SYSCS_UTIL.SYSCS_BACKUP_DATABASE_NOWAIT('extinout/mybackup') ;
ERROR XSRSB: Backup cannot be performed in a transaction with uncommitted unlogged operations.
ij(C1)> call SYSCS_UTIL.SYSCS_BACKUP_DATABASE_AND_ENABLE_LOG_ARCHIVE_MODE(
'extinout/mybackup', 1);
ERROR XSRSB: Backup cannot be performed in a transaction with uncommitted unlogged operations.
ij(C1)> call SYSCS_UTIL.SYSCS_BACKUP_DATABASE_AND_ENABLE_LOG_ARCHIVE_MODE_NOWAIT(
'extinout/mybackup', 1);
ERROR XSRSB: Backup cannot be performed in a transaction with uncommitted unlogged operations.
ij(C1)> --backup failures should not rollback/commit the transaction.
select * from t1 ;
A
-----------
1
2
3
ij(C1)> insert into t1 values(4) ;
1 row inserted/updated/deleted
ij(C1)> commit;
ij(C1)> drop index idx1;
0 rows inserted/updated/deleted
ij(C1)> commit;
ij(C1)> --- make sure backup calls can be run one after another.
insert into t1 values(5) ;
1 row inserted/updated/deleted
ij(C1)> call SYSCS_UTIL.SYSCS_BACKUP_DATABASE('extinout/mybackup') ;
0 rows inserted/updated/deleted
ij(C1)> call SYSCS_UTIL.SYSCS_BACKUP_DATABASE_NOWAIT('extinout/mybackup');
0 rows inserted/updated/deleted
ij(C1)> call SYSCS_UTIL.SYSCS_BACKUP_DATABASE_AND_ENABLE_LOG_ARCHIVE_MODE(
'extinout/mybackup', 1);
0 rows inserted/updated/deleted
ij(C1)> call SYSCS_UTIL.SYSCS_BACKUP_DATABASE_AND_ENABLE_LOG_ARCHIVE_MODE_NOWAIT(
'extinout/mybackup', 1);
0 rows inserted/updated/deleted
ij(C1)> call SYSCS_UTIL.SYSCS_DISABLE_LOG_ARCHIVE_MODE(1);
0 rows inserted/updated/deleted
ij(C1)> commit;
ij(C1)> -- make sure backup is not allowed when non-logged
-- operations are pending
connect 'wombat' as c2 ;
ij(C2)> autocommit off ;
ij(C2)> -- index creaton is a non-logged ops, backup should not run
-- until it is committed
create index idx1 on t1(a) ;
0 rows inserted/updated/deleted
ij(C2)> set connection c1 ;
ij(C1)> -- following two backup calls should fail , because they are not waiting
-- for the unlogged index creation in anothere transaction to commit/rollback.
call SYSCS_UTIL.SYSCS_BACKUP_DATABASE_NOWAIT('extinout/mybackup') ;
ERROR XSRSA: Cannot backup the database when unlogged operations are uncommitted. Please commit the transactions with backup blocking operations.
ij(C1)> call SYSCS_UTIL.SYSCS_BACKUP_DATABASE_AND_ENABLE_LOG_ARCHIVE_MODE_NOWAIT(
'extinout/mybackup', 1);
ERROR XSRSA: Cannot backup the database when unlogged operations are uncommitted. Please commit the transactions with backup blocking operations.
ij(C1)> set connection c2;
ij(C2)> rollback ;
ij(C2)> -- make sure backup call waits, if wait parameter value is non-zero or
-- the procedures used from before 10.2( old backup procedures wait by
-- default for unlogged operation to finish.)
-- This testing is done by starting backup in a different thread and then
-- wait for few seconds and check if the backup dir is created ?
-- If backup dir is not created , the backup thread is waiting for unlogged
-- op to finih.
-- Note: Not a 100% foolproof approach because checking for backupdir
-- might occur before backup thread gets into action. But I think
-- test will fail atleast on some systems, if backup is not waiting
-- for unlogged ops to complete.
-- case1 : simple database backup with unlogged ops pending.
set connection c2;
ij(C2)> -- index is a non-logged operation
create index idx1 on t1(a) ;
0 rows inserted/updated/deleted
ij(C2)> set connection c1;
ij(C1)> -- make sure backup does not already exists at the backup location.
values removeDirectory('extinout/ulbackup1');
1
----------------------------------------------------------------------------------------------------
true
ij(C1)> values fileExists('extinout/ulbackup1');
1
----------------------------------------------------------------------------------------------------
false
ij(C1)> async bthread1 'call SYSCS_UTIL.SYSCS_BACKUP_DATABASE(
''extinout/ulbackup1'')' ;
ij(C1)> set connection c2;
ij(C2)> -- sleep for a while for the backup thread to
-- really get into the wait state
call sleep(1000);
0 rows inserted/updated/deleted
ij(C2)> -- make sure backup did not really proceed, backup dir should not exist
values fileExists('extinout/ulbackup1');
1
----------------------------------------------------------------------------------------------------
false
ij(C2)> -- rollback the unlogged op for backup to proceed.
rollback;
ij(C2)> set connection c1;
ij(C1)> -- wait for backup thread to finish the work.
wait for bthread1;
0 rows inserted/updated/deleted
ij(C1)> -- check if backup is created.
values fileExists('extinout/ulbackup1');
1
----------------------------------------------------------------------------------------------------
true
ij(C1)> commit;
ij(C1)> -- case2: simple backup call with the default wait for ulogged ops
set connection c2;
ij(C2)> create index idx1 on t1(a) ;
0 rows inserted/updated/deleted
ij(C2)> set connection c1;
ij(C1)> -- make sure backup does not already exists at the backup location.
values removeDirectory('extinout/ulbackup2');
1
----------------------------------------------------------------------------------------------------
true
ij(C1)> values fileExists('extinout/ulbackup2');
1
----------------------------------------------------------------------------------------------------
false
ij(C1)> async bthread1
'call SYSCS_UTIL.SYSCS_BACKUP_DATABASE(''extinout/ulbackup2'')';
ij(C1)> set connection c2;
ij(C2)> -- sleep for a while for the backup thread to
-- really get into the wait state
call sleep(1000);
0 rows inserted/updated/deleted
ij(C2)> -- make sure backup did not really proceed, backup dir should not exist
values fileExists('extinout/ulbackup2');
1
----------------------------------------------------------------------------------------------------
false
ij(C2)> -- rollback the unlogged op for backup to proceed.
rollback;
ij(C2)> set connection c1;
ij(C1)> -- wait for backup thread to finish the work.
wait for bthread1;
0 rows inserted/updated/deleted
ij(C1)> -- check if backup is created.
values fileExists('extinout/ulbackup2');
1
----------------------------------------------------------------------------------------------------
true
ij(C1)> commit;
ij(C1)> --- case 3: log archive backup with with unlogged ops pending.
set connection c2;
ij(C2)> create index idx1 on t1(a) ;
0 rows inserted/updated/deleted
ij(C2)> set connection c1;
ij(C1)> --make sure backup does not already exists at the backup location.
values removeDirectory('extinout/ulbackup3');
1
----------------------------------------------------------------------------------------------------
true
ij(C1)> values fileExists('extinout/ulbackup3');
1
----------------------------------------------------------------------------------------------------
false
ij(C1)> async bthread1
'call SYSCS_UTIL.SYSCS_BACKUP_DATABASE_AND_ENABLE_LOG_ARCHIVE_MODE(
''extinout/ulbackup3'' , 1)' ;
ij(C1)> set connection c2;
ij(C2)> -- sleep for a while for the backup thread to
-- really get into the wait state
call sleep(1000);
0 rows inserted/updated/deleted
ij(C2)> -- make sure backup did not really proceed, backup dir should not exist
values fileExists('extinout/ulbackup3');
1
----------------------------------------------------------------------------------------------------
false
ij(C2)> -- rollback the unlogged op for backup to proceed.
rollback;
ij(C2)> set connection c1;
ij(C1)> -- wait for backup thread to finish the work.
wait for bthread1;
0 rows inserted/updated/deleted
ij(C1)> -- check if backup is created.
values fileExists('extinout/ulbackup3');
1
----------------------------------------------------------------------------------------------------
true
ij(C1)> call SYSCS_UTIL.SYSCS_DISABLE_LOG_ARCHIVE_MODE(1);
0 rows inserted/updated/deleted
ij(C1)> -- case4 : log archive backup with the defailt wait for unlogged ops.
set connection c2;
ij(C2)> create index idx1 on t1(a) ;
0 rows inserted/updated/deleted
ij(C2)> set connection c1;
ij(C1)> --make sure backup does not already exists at the backup location.
values removeDirectory('extinout/ulbackup4');
1
----------------------------------------------------------------------------------------------------
true
ij(C1)> values fileExists('extinout/ulbackup4');
1
----------------------------------------------------------------------------------------------------
false
ij(C1)> async bthread1
'call SYSCS_UTIL.SYSCS_BACKUP_DATABASE_AND_ENABLE_LOG_ARCHIVE_MODE(
''extinout/ulbackup4'' , 1)' ;
ij(C1)> set connection c2;
ij(C2)> -- sleep for a while for the backup thread to
-- really get into the wait state
call sleep(1000);
0 rows inserted/updated/deleted
ij(C2)> -- make sure backup did not really proceed, backup dir should not exist
values fileExists('extinout/ulbackup4');
1
----------------------------------------------------------------------------------------------------
false
ij(C2)> -- commit the unlogged op for backup to proceed.
commit;
ij(C2)> set connection c1;
ij(C1)> -- wait for backup thread to finish the work.
wait for bthread1;
0 rows inserted/updated/deleted
ij(C1)> -- check if backup is created.
values fileExists('extinout/ulbackup4');
1
----------------------------------------------------------------------------------------------------
true
ij(C1)> call SYSCS_UTIL.SYSCS_DISABLE_LOG_ARCHIVE_MODE(1);
0 rows inserted/updated/deleted
ij(C1)>