redoアーカイブできないときの挙動

(8.0.22)

https://dev.mysql.com/doc/refman/8.0/en/innodb-init-startup-configuration.html#innodb-startup-log-file-configuration
https://qiita.com/kyou-0576/items/f581e5ec0a982a4e7100

-- redoログ格納場所

/var/lib/mysql/ib_logfile0
/var/lib/mysql/ib_logfile1

循環で再利用される

-- アーカイブログ格納場所

log_binで絶対パス+ログ名プリフィックスを指定する

log_bin_basenameパラメータで確認する


-- アーカイブできないときの挙動確認
500MBのディスクを追加し、/var/lib/mysql/arcにマウント


vim /etc/my.cnf

binlog_format=ROW
log_bin="/var/lib/mysql/arc/binlog"

select @@log_bin;
select @@log_bin_basename;

 

drop table tab1;
create table tab1(col1 int);
insert into tab1 values(1);
select * from tab1;

drop procedure proc1;

delimiter //
create procedure proc1(in x int)
begin
declare i int;
set i = 0;
while i < x do
set i = i + 1;
insert into tab1 select * from tab1;
end while;
end
//
delimiter ;

call proc1(16);
select count(*) from tab1;


drop procedure proc2;

delimiter //
create procedure proc2()
begin
loop
update tab1 set col1=col1+1;
flush logs;
end loop;
end
//
delimiter ;

call proc2();

show binary logs;

※ログに出力されたメッセージ

2021-03-12T18:18:41.024669Z 8 [ERROR] [MY-000035] [Server] Disk is full writing '/var/lib/mysql/arc/binlog.000840' (OS errno 28 - No space left on device). Waiting for someone to free space... Retry in 60 secs. Message reprinted in 600 secs.

クライアント側はなにも出力されない。
DBに新規接続はできる。create文は実行できない。

アーカイブログ格納先を変更することで復旧できた。

 

 

(19c)

-- redoログ格納場所

DB作成時に指定する

select * from v$log;
select * from v$logfile;

循環で再利用される

-- アーカイブログ格納場所

log_archive_dest_1パラメータで指定する

archive log list;

show parameter log_archive_dest_1
show parameter db_recovery_file_dest

log_archive_dest_1の指定なし、高速リカバリ領域を構成ありの場合は、
高速リカバリ領域がアーカイブログ格納先となる


log_archive_dest_1の指定なし、高速リカバリ領域を構成なしの場合は、
$ORACLE_HOME/dbsがアーカイブログ格納先となる

 

-- アーカイブできないときの挙動確認
500MBのディスクを追加し、/u01/app/oracle/arcにマウント

alter system set log_archive_dest_1='location=/u01/app/oracle/arc' scope=spfile;
shutdown immediate;
startup
archive log list;


drop table tab1 purge;
create table tab1(col1 int);
insert into tab1 values(1);
commit;
select * from tab1;

 

declare
begin
loop
execute immediate 'insert into tab1 select * from tab1';
execute immediate 'alter system archive log current';
end loop;
end;
/


※アラートログに出力されたメッセージ

2021-03-13T00:18:57.239927+09:00
ARC3 (PID:2900): Encountered disk I/O error 19502
2021-03-13T00:18:57.269915+09:00
Closing local archive destination LOG_ARCHIVE_DEST_1 '/u01/app/oracle/arc/1_650_1017193262.dbf', error=19502 (orcl)
2021-03-13T00:18:57.358058+09:00
Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_arc3_2900.trc:
ORA-27072: ファイルI/Oエラーが発生しました。
Linux-x86_64 Error: 28: No space left on device
Additional information: 4
Additional information: 16384
Additional information: 4294967295
ORA-19502: ファイル"/u01/app/oracle/arc/1_650_1017193262.dbf"、ブロック番号16384(ブロック・サイズ=512)で書込みエラーが発生しました
2021-03-13T00:18:57.371042+09:00
Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_arc3_2900.trc:
ORA-19502: ファイル"/u01/app/oracle/arc/1_650_1017193262.dbf"、ブロック番号16384(ブロック・サイズ=512)で書込みエラーが発生しました
ORA-27072: ファイルI/Oエラーが発生しました。
Linux-x86_64 Error: 28: No space left on device
Additional information: 4
Additional information: 16384
Additional information: 4294967295
ORA-19502: ファイル"/u01/app/oracle/arc/1_650_1017193262.dbf"、ブロック番号16384(ブロック・サイズ=512)で書込みエラーが発生しました
ARC3 (PID:2900): I/O error 19502 archiving LNO:2 to '/u01/app/oracle/arc/1_650_1017193262.dbf'
ARC3 (PID:2900): Stuck archiver: insufficient local LADs
ARC3 (PID:2900): Stuck archiver condition declared
2021-03-13T00:18:57.556139+09:00
Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_arc3_2900.trc:
ORA-16038: ログ2、順序番号650をアーカイブできません。
ORA-19502: ファイル""、ブロック番号(ブロック・サイズ=)で書込みエラーが発生しました
ORA-00312: オンライン・ログ2 スレッド1: '/u01/app/oracle/oradata/ORCL/redo02.log'
ARC3 (PID:2900): Archival error occurred on a closed thread, archiver continuing
2021-03-13T00:18:57.556324+09:00
ORACLE Instance orcl, archival error, archiver continuing

クライアント側はなにも出力されない。
DBに新規接続はできる。create文は実行できない。
下記のようにアーカイブログ格納先を変更することで復旧できた。

alter system reset log_archive_dest_1 scope=spfile;
shutdown abort;
startup
archive log list;

 

(13)

-- redoログ格納場所

$PGDATA/pg_wal

新しいログファイルは昇順で追加され
古いログはmax_wal_sizeの指定に従い削除される


-- アーカイブログ格納場所

archive_commandパラメータで指定

 

-- アーカイブできないときの挙動確認
500MBのディスクを追加し、/var/lib/pgsql/13/data/arcにマウント


archive_command = 'test ! -f /var/lib/pgsql/13/data/arc/%f && cp %p /var/lib/pgsql/13/data/arc/%f'


drop table tab1;
create table tab1(col1 int);
insert into tab1 values(1);
select * from tab1;


do $$
declare
begin
loop
insert into tab1 select * from tab1;
perform pg_switch_wal();
end loop;
end
$$
;


※ログに出力されたメッセージ


2021-03-13 01:20:50.310 JST [4996] LOG: archive command failed with exit code 1
2021-03-13 01:20:50.310 JST [4996] DETAIL: The failed archive command was: test ! -f /var/lib/pgsql/13/data/arc/0000000100000003000000FA && cp pg_wal/0000000100000003000000FA /var/lib/pgsql/13/data/arc/0000000100000003000000FA
2021-03-13 01:20:50.310 JST [4996] WARNING: archiving write-ahead log file "0000000100000003000000FA" failed too many times, will try again later


アーカイブログ格納域がディスクフルになるとmax_wal_sizeの値に関係なく$PGDATA/pg_walにWALが累積し
クライアント側の処理は継続する

 

(2019)

https://www.atmarkit.co.jp/ait/articles/1610/31/news016.html

-- redoログ格納場所

トランザクションログ

DB作成時に指定する

復旧モデルが完全、一括ログの場合は
トランザクションログのバックアップを取得するまでは再利用されない


-- アーカイブログ格納場所

トランザクションログについてはアーカイブの概念はない。


-- アーカイブできないときの挙動確認
500MBのディスクを追加し、E:\DATAにマウント

use master;
create database test2
on primary
( name = test2_dat,
filename = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\test2.mdf',
size = 50mb,
maxsize = UNLIMITED,
filegrowth = 10mb )
log on
( name = test2_log_1,
filename = 'E:\data\test2_log_1.ldf',
size = 50mb,
maxsize = UNLIMITED,
filegrowth = 10mb ) ;

alter database test2 set recovery full with no_wait;

select database_id,name,recovery_model,recovery_model_desc
from sys.databases
order by database_id;

use test2

drop table tab1;
create table tab1(col1 int);
insert into tab1 values(1);
select * from tab1;

while 1=1
begin
insert into tab1 select * from tab1;
end

※ログに出力されたメッセージ

2021-03-13 02:15:41.12 spid57 エラー: 17053、重大度: 16、状態: 1。
2021-03-13 02:15:41.12 spid57 E:\data\test2_log_1.ldf: Operating system error 112(ディスクに十分な空き領域がありません。) encountered.
2021-03-13 02:15:42.13 spid57 エラー: 9002、重大度: 17、状態: 4。
2021-03-13 02:15:42.13 spid57 The transaction log for database 'test2' is full due to 'ACTIVE_TRANSACTION'.


※クライアント側で出力されたメッセージ

メッセージ 9002、レベル 17、状態 4、行 3
'ACTIVE_TRANSACTION' により、データベース 'test2' のトランザクション ログがいっぱいになっています。

エラー発生後は、小さいトランザクションであれば実行可能

※復旧方法
トランザクションバックアップを取得

タスク→圧縮→Fileからトランザクションログを圧縮を実行
(T-SQLで実行する場合は下記)
use test2
go
dbcc shrinkfile('test2_log_1' , 0, truncateonly)
go