DBファイル移動時のDMLへの影響

(8.0.26)
https://qiita.com/terra_yucco/items/6e4f02f8aaff25529dec


-- 1. データファイル移動先の準備
mkdir -p /home/mysql/tbs1
chown -R mysql:mysql /home/mysql

vim /etc/my.cnf
innodb_directories=/home/mysql

systemctl restart mysqld

select @@innodb_directories;

select * from information_schema.INNODB_TABLESPACES;

create tablespace tbs1 add datafile '/home/mysql/tbs1/tbs11.ibd' engine=innodb;


-- 2. テストテーブル作成し100万件データ投入
drop table tab1;
create table tab1(col1 int auto_increment primary key,col2 datetime(6) );

drop procedure proc1;

delimiter //
create procedure proc1(in x int)
begin
  declare i bigint;
  set i = 0;
  start transaction;
  while i < x do
    set i = i + 1;
    insert into tab1(col2) values(CURRENT_TIMESTAMP(6) );
  end while;
  commit;
end
//
delimiter ;

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

 

-- 3. データ投入しながらデータファイル移動
drop procedure proc1;

delimiter //
create procedure proc1()
begin
  while true do
    insert into tab1(col2) values(CURRENT_TIMESTAMP(6) );
  end while;
end
//
delimiter ;

call proc1();


alter table tab1 tablespace tbs1;

 

-- 4. データファイル移動中の最大待ち時間確認

select * from tab1 order by col1 limit 100;

select col1,col2
,lag(col2) over(order by col1) col3
,( col2 - lag(col2) over(order by col1) ) col4
,TIMESTAMPDIFF(MICROSECOND , lag(col2) over(order by col1) ,col2 ) col5
from tab1 
order by col5 desc limit 100;


※datetime型の引き算は数字列の差分となる

→0.062723秒
オンライン実行可能

 

(19c)
-- 1. データファイル移動先の準備

mkdir /home/oracle/pdb1


-- 2. テストテーブル作成し100万件データ投入
drop table tab1 purge;
create table tab1(col1 int generated by default as identity primary key, col2 timestamp) tablespace users;

alter session set nls_timestamp_format='HH24:MI:SSXFF';

declare
begin
for i in 1..1000000 loop
  insert into tab1(col2) values(systimestamp);
end loop;
end;
/

commit;
select count(*) from tab1;

 

-- 3. データ投入しながらデータファイル移動

declare
begin
while true loop
  insert into tab1(col2) values(systimestamp);
  commit;
end loop;
end;
/

select file_id,file_name from dba_data_files order by file_id;
alter database move datafile 11 to '/home/oracle/pdb1/users01.dbf' ;

 


-- 4. データファイル移動中の最大待ち時間確認

select * from tab1 order by col1 fetch first 100 rows only;

select col1,col2
,lag(col2) over(order by col1) col3
,( col2 - lag(col2) over(order by col1) ) col4
from tab1 
order by col4 desc fetch first 100 rows only;

→1.553268秒
オンライン実行可能

 

 

(14)
-- 1. データファイル移動先の準備

sudo mkdir -p /home/postgres/tbs1
sudo chown -R postgres:postgres /home/postgres

\db+

create tablespace tbs1 owner postgres location '/home/postgres/tbs1';


-- 2. テストテーブル作成し100万件データ投入

drop table tab1;
create table tab1(col1 int generated by default as identity primary key,col2 timestamp);


insert into tab1(col2) select clock_timestamp() from generate_series(1,1000000) g;

select count(*) from tab1;

 

-- 3. データ投入しながらデータファイル移動

create or replace procedure proc1()
language plpgsql
as $$
begin
  while true loop
    insert into tab1(col2) values(clock_timestamp() );
    commit;
  end loop;
end
$$;

call  proc1();


alter table tab1 set tablespace tbs1;

 


-- 4. データファイル移動中の最大待ち時間確認

\pset pager 0

select * from tab1 order by col1 fetch first 100 rows only;

select col1,col2
,lag(col2) over(order by col1) col3
,( col2 - lag(col2) over(order by col1) ) col4
from tab1 
order by col4 desc fetch first 100 rows only;

→0.730655秒
オンライン実行可能

 

 

 

(2019)

-- 1. データファイル移動先の準備

mkdir C:\test

alter database test remove file tbs1_01;
alter database test remove filegroup tbs1;

alter database test add filegroup tbs1;
alter database test add file
     (name = tbs1_01 ,filename = 'C:\test\tbs1_01.ndf'
     ) to filegroup tbs1
;


-- 2. テストテーブル作成し100万件データ投入

drop table tab1;

create table tab1(col1 int identity(1,1) not null,col2 datetime2);
alter table tab1 add constraint tab1pk primary key(col1);


set nocount on
declare @i int;
set @i = 1;
begin transaction;
while @i <= 1000000
begin
  insert into tab1(col2) values(getdate() );
  set @i = @i + 1;
end
commit;


select count(*) from tab1;

 

-- 3. データ投入しながらデータファイル移動

set nocount on;
while 1=1
begin
  begin transaction;
  insert into tab1(col2) values(getdate() );
  commit;
end


alter table tab1 drop tab1pk with ( move to tbs1 );

 


-- 4. データファイル移動中の最大待ち時間確認


select top 100 * from tab1 order by col1;

select top 100 col1,col2
,lag(col2) over(order by col1) col3
,datediff(MICROSECOND,lag(col2) over(order by col1),col2) col4
from tab1 
order by col4 desc;


→0.353333秒
オンライン実行可能