データベースファイル移動

(8.0.26)
https://ez-net.jp/article/4B/v4oWna5J/kpwT0SuSlcvA/
https://qiita.com/ShuM/items/1a960b4ef53f8a08dd5a
https://dev.mysql.com/doc/refman/8.0/ja/general-tablespaces.html#general-tablespaces-moving-non-partitioned-tables


データディレクトリの移動

select @@datadir;

mkdir -p /home/mysql/data
chown -R mysql:mysql /home/mysql

vim /etc/my.cnf
datadir=/home/mysql/data
socket=/home/mysql/data/mysql.sock

[client]
socket=/home/mysql/data/mysql.sock

※client側のsocket設定も明示的に追加する


systemctl stop mysqld

mv /var/lib/mysql/* /home/mysql/data


systemctl start mysqld
systemctl status mysqld

select @@datadir;


※一部のテーブルだけ移動したい場合、テーブルスペースを使用する。
移動先ディレクトリをinnodb_directoriesに指定する必要がある。


vim /etc/my.cnf
innodb_directories=/var/lib/mysql

systemctl restart mysqld
select @@innodb_directories;

select * from information_schema.INNODB_TABLESPACES;

create tablespace tbs1 add datafile '/var/lib/mysql/tbs1.ibd' engine=innodb;

alter table tab1 tablespace tbs1;


テーブルスペースを使用せずに直接ディレクトリを指定する下記構文はalter table文では動作しなかった。
( create table文であれば動作した。)
alter table tab2 data directory '/var/lib/mysql';

 

 

(19c)

https://qiita.com/plusultra/items/f75b9286c76e75a37937
https://qiita.com/mikoski01/items/646bb221cdc3ef2a054a

-- PDBの場合

mkdir /home/oracle/pdb1

select file_id,file_name from dba_data_files order by file_id;

alter database move datafile  9 to '/home/oracle/pdb1/system01.dbf' ;
alter database move datafile 10 to '/home/oracle/pdb1/sysaux01.dbf' ;
alter database move datafile 11 to '/home/oracle/pdb1/users01.dbf' ;
alter database move datafile 12 to '/home/oracle/pdb1/usertbs01.dbf' ;


→ 通常表領域、システム表領域、UNDO表領域についてはオンラインでデータファイルを移動可能

※一時表領域はオンラインで移動できないため、データファイルを追加してから削除する

select file_id,file_name from dba_temp_files order by file_id;

alter tablespace temp add tempfile '/home/oracle/pdb1/temp01.dbf' size 128m autoextend on;
alter database tempfile '/u01/app/oracle/oradata/orcl/pdb1/temp01.dbf' offline;
alter database tempfile '/u01/app/oracle/oradata/orcl/pdb1/temp01.dbf' drop including datafiles;


-- CDBの場合
mkdir /home/oracle/cdb

select file_id,file_name from dba_data_files order by file_id;

alter database move datafile  1 to '/home/oracle/cdb/system01.dbf' ;
alter database move datafile  3 to '/home/oracle/cdb/sysaux01.dbf' ;
alter database move datafile  5 to '/home/oracle/cdb/undo01.dbf' ;
alter database move datafile  6 to '/home/oracle/cdb/users01.dbf' ;


→ 通常表領域、システム表領域、UNDO表領域についてはオンラインでデータファイルを移動可能
※一時表領域はオンラインで移動できないため、データファイルを追加してから削除する


select file_id,file_name from dba_temp_files order by file_id;

alter tablespace temp add tempfile '/home/oracle/cdb/temp01.dbf' size 128m autoextend on;
alter database tempfile '/u01/app/oracle/oradata/orcl/temp01.dbf' offline;
alter database tempfile '/u01/app/oracle/oradata/orcl/temp01.dbf' drop including datafiles;


-- REDOログの場合
select * from v$log order by group#;
select * from v$logfile order by group#,member;


alter database add logfile member '/home/oracle/cdb/redo01a.log' to group 1;
alter database add logfile member '/home/oracle/cdb/redo01b.log' to group 1;

alter database add logfile member '/home/oracle/cdb/redo02a.log' to group 2;
alter database add logfile member '/home/oracle/cdb/redo02b.log' to group 2;

alter database add logfile member '/home/oracle/cdb/redo03a.log' to group 3;
alter database add logfile member '/home/oracle/cdb/redo03b.log' to group 3;

alter system switch logfile;
alter system switch logfile;
alter system switch logfile;

alter database drop logfile member '/u01/app/oracle/oradata/orcl/redo01a.log';
alter database drop logfile member '/u01/app/oracle/oradata/orcl/redo01b.log';

alter database drop logfile member '/u01/app/oracle/oradata/orcl/redo02a.log';
alter database drop logfile member '/u01/app/oracle/oradata/orcl/redo02b.log';

alter database drop logfile member '/u01/app/oracle/oradata/orcl/redo03a.log';
alter database drop logfile member '/u01/app/oracle/oradata/orcl/redo03b.log';

 

 

(14)
https://ex1.m-yabe.com/archives/4719


データディレクトリの移動
sudo mkdir /home/postgres
sudo chown postgres:postgres /home/postgres

sudo systemctl stop postgresql-14

vim postgresql.conf
data_directory = '/home/postgres/data'

mv /var/lib/pgsql/14/data /home/postgres

sudo vim /usr/lib/systemd/system/postgresql-14.service
Environment=PGDATA=/var/lib/pgsql/14/data/

Environment=PGDATA=/home/postgres/data/

sudo systemctl daemon-reload

sudo systemctl start postgresql-14
sudo systemctl status postgresql-14

sudo vim ~/.bash_profile
PGDATA=/var/lib/pgsql/14/data

PGDATA=/home/postgres/data/

. ~/.bash_profile


※一部のテーブルだけ移動したい場合は、テーブルスペースを使用する
テーブルスペースではシンボリックリンクが使用されている

mkdir /var/lib/pgsql/14/tbs1

\db+

create tablespace tbs1 owner postgres location '/var/lib/pgsql/14/tbs1';

alter table tab1 set tablespace tbs1;
alter index ind1 set tablespace tbs1;

 

 

(2019)
https://docs.microsoft.com/ja-jp/sql/relational-databases/databases/move-database-files?view=sql-server-ver15
https://docs.microsoft.com/ja-jp/sql/relational-databases/databases/move-system-databases?view=sql-server-ver15

cd C:\
mkdir mssql\master
mkdir mssql\tempdb
mkdir mssql\test

-- 1. masterシステム データベースの移動

[SQL Server 構成マネージャー] から [起動時のパラメーターの指定] タブを開き、
マスター "データ" ファイルの新しいパスにパラメーターを変更します

-dC:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\master.mdf
-lC:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\mastlog.ldf

-dC:\mssql\master\master.mdf
-lC:\mssql\master\masterlog.ldf

net stop mssqlserver

move "C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\master.mdf" "C:\mssql\master\master.mdf"
move "C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\mastlog.ldf" "C:\mssql\master\masterlog.ldf"

net start mssqlserver

select name, physical_name as currentlocation, state_desc
from sys.master_files
where database_id = db_id(N'master');

 

-- 2. tempdbシステム データベースの移動
※tempdb は SQL Serverインスタンスが開始されるたびに再作成されるので、データ ファイルとログ ファイルを物理的に移動する必要はありません。


alter database tempdb modify file ( name = tempdev , filename = 'C:\mssql\tempdb\tempdb.mdf' )
alter database tempdb modify file ( name = temp2 , filename = 'C:\mssql\tempdb\tempdb2.ndf' )
alter database tempdb modify file ( name = templog , filename = 'C:\mssql\tempdb\tempdblog.ldf' )

net stop mssqlserver
net start mssqlserver

select name, physical_name as currentlocation, state_desc
from sys.master_files
where database_id = db_id(N'tempdb');

del "C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\tempdb.mdf" 
del "C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\tempdb_mssql_2.ndf" 
del "C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\templog.ldf" 

 

-- 3. ユーザー データベースの移動

alter database test modify file ( name = test_dat, filename =  'C:\mssql\test\test.mdf' )
alter database test modify file ( name = test_log, filename =  'C:\mssql\test\testlog.ldf' )


alter database test set offline with rollback immediate;

ファイルを新しい場所に移動します。
move "C:\DATA\test_dat.mdf" "C:\mssql\test\test.mdf"
move "C:\DATA\test_log.ldf" "C:\mssql\test\testlog.ldf"

alter database test set online;

select name, physical_name as currentlocation, state_desc
from sys.master_files
where database_id = db_id(N'test');

 

-- 4. 一部のテーブルだけ移動したい場合
MOVE TO オプションを指定すると、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
;

drop table tab1;
create table tab1(col1 int not null);
insert into tab1 values(1);
alter table tab1 add constraint tab1pk primary key(col1);


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


ファイル移動の確認
select * from sys.database_files;

select top 100 t1.col1,t2.file_id,t2.page_id,t2.slot_id
from tab1 t1
cross apply sys.fn_PhysLocCracker(%%physloc%%) as t2
order by t2.file_id, t2.page_id, t2.slot_id
;