Ubuntuのヘッドレスインストール

https://rabbit-note.com/2020/06/06/raspberry-pi-ubuntu-headless-install/

HW:Raspberry Pi 4 Model B(4GB)
OS:Ubuntu 20.04(64bit)

前提:有線LANでDHCP有効化済

--1. Ubuntu 20.04をSD Cardに書き込む
Raspberry Pi Imagerを使用

--2. SD Cardを挿してRaspberry Pi の電源ON、10分程度待ってから再起動

SSH接続
デフォルトユーザ: ubuntu
デフォルトパスワード: ubuntu

初回ログイン時にパスワード設定

--3. パスワード再設定
sudo su -
passwd ubuntu


--4. IPアドレス設定

vi /etc/netplan/50-cloud-init.yaml

network:
    ethernets:
        eth0:
            dhcp4: false
            dhcp6: false
    version: 2
    wifis:
        wlan0:
            access-points:
                AAAAAAAA:
                    password: XXXXXX
            dhcp4: false
            addresses: [10.10.10.10/24]
            gateway4: 10.10.10.1
            nameservers:
              addresses: [8.8.8.8]

netplan apply

--5. タイムゾーン設定
sudo su -
timedatectl set-timezone Asia/Tokyo

--6. ソフトウェア更新
apt update
apt upgrade
apt autoremove
apt clean

--7. ファームウェア更新
apt install rpi-eeprom
rpi-eeprom-update

phantom unique key violation

MySQLPostgreSQLは発生する
OracleSQL Serverは発生しない

(8.0.26)
https://nodoame.net/archives/8026

drop table tab1;
create table tab1(col1 int primary key,col2 int);

insert into tab1 values(1,1);
insert into tab1 values(2,2);

select * from tab1;

update tab1 t1 set col1=(select case when t2.col1=1 then 2 when t2.col1=2 then 1 end from tab1 t2 where t1.col1=t2.col1);

→エラーになる★
ERROR 1093 (HY000): You can't specify target table 't1' for update in FROM clause


update tab1 t1 set col1=(select case when t2.col1=1 then 2 when t2.col1=2 then 1 end from (select * from tab1) t2 where t1.col1=t2.col1);

→エラーになる★
ERROR 1062 (23000): Duplicate entry '2' for key 'tab1.PRIMARY'

explain
update tab1 t1 set col1=(select case when t2.col1=1 then 2 when t2.col1=2 then 1 end from (select * from tab1) t2 where t1.col1=t2.col1);

(19c)

drop table tab1 purge;
create table tab1(col1 int primary key,col2 int);

insert into tab1 values(1,1);
insert into tab1 values(2,2);

select * from tab1;

update tab1 t1 set col1=(select case when t2.col1=1 then 2 when t2.col1=2 then 1 end from tab1 t2 where t1.col1=t2.col1);

→エラーなく更新可能

explain plan for
update tab1 t1 set col1=(select case when t2.col1=1 then 2 when t2.col1=2 then 1 end from tab1 t2 where t1.col1=t2.col1);
select * from table(dbms_xplan.display());

 

(14)

drop table tab1;
create table tab1(col1 int primary key,col2 int);

insert into tab1 values(1,1);
insert into tab1 values(2,2);

select * from tab1;

update tab1 t1 set col1=(select case when t2.col1=1 then 2 when t2.col1=2 then 1 end from tab1 t2 where t1.col1=t2.col1);

→エラーになる★
ERROR:  duplicate key value violates unique constraint "tab1_pkey"
DETAIL:  Key (col1)=(2) already exists.

explain
update tab1 t1 set col1=(select case when t2.col1=1 then 2 when t2.col1=2 then 1 end from tab1 t2 where t1.col1=t2.col1);

(2019)

drop table tab1;
create table tab1(col1 int primary key,col2 int);

insert into tab1 values(1,1);
insert into tab1 values(2,2);

select * from tab1;

 

update t1
set t1.col1 = ( case when t2.col1=1 then 2 when t2.col1=2 then 1 end )
from tab1 t1 inner join tab1 t2
on t1.col1=t2.col1
;

→エラーなく更新可能
set showplan_all on
go
update t1
set t1.col1 = ( case when t2.col1=1 then 2 when t2.col1=2 then 1 end )
from tab1 t1 inner join tab1 t2
on t1.col1=t2.col1
;
go
set showplan_all off
go

dropとtruncateの速度比較


(8.0.22)

 

vim /etc/my.cnf
max_allowed_packet = 16MB;

show variables like 'max_allowed_packet';


set sql_log_bin = OFF;

drop table tab1;
create table tab1(
 col1  int
,col2  varchar(500)
,col3  varchar(500)
,col4  varchar(500)
,col5  varchar(500)
,col6  varchar(500)
,col7  varchar(500)
,col8  varchar(500)
,col9  varchar(500)
,col10 varchar(500)
,col11 varchar(500)
,col12 varchar(500)
,col13 varchar(500)
,col14 varchar(500)
,col15 varchar(500)
,col16 varchar(500)
,col17 varchar(500)
,col18 varchar(500)
,col19 varchar(500)
,col20 varchar(500)
,col21 varchar(500)
,col22 varchar(500)
,col23 varchar(500)
,col24 varchar(500)
,col25 varchar(500)
,col26 varchar(500)
,col27 varchar(500)
,col28 varchar(500)
,col29 varchar(500)
,col30 varchar(500)
);


set @i:=0; insert into tab1
  select @i:=@i+1 ,
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X'),
  rpad('X',500,'X')
from information_schema.columns;


drop procedure proc1;

delimiter //
create procedure proc1(in param1 integer)
begin
  declare i int;

  set i = 1;
  while i <= param1 do
    set @i:=0; insert into tab1
      select @i:=@i+1 ,
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X'),
      rpad('X',500,'X')
    from information_schema.columns;
    set i = i + 1;
  end while;
end
//
delimiter ;

call proc1(100);

2 hours 17 min 29.54 sec

 

analyze table tab1;
select
    table_name,
    table_rows as tbl_rows,
    floor( (data_length)/1024/1024/1024) AS gbyte
from information_schema.tables
where table_schema=database()
and table_name = 'tab1'
;

82G


[1] DROPの場合
drop table tab1;
0.78 sec


[2] TRUNCATEの場合
truncate table tab1;
0.70 sec

 


(19c)

 

set time on
set timing on

drop table tab1 purge;
create table tab1(
 col1  int
,col2  varchar2(4000)
,col3  varchar2(4000)
,col4  varchar2(4000)
,col5  varchar2(4000)
,col6  varchar2(4000)
,col7  varchar2(4000)
,col8  varchar2(4000)
,col9  varchar2(4000)
,col10 varchar2(4000)
,col11 varchar2(4000)
,col12 varchar2(4000)
,col13 varchar2(4000)
,col14 varchar2(4000)
,col15 varchar2(4000)
,col16 varchar2(4000)
,col17 varchar2(4000)
,col18 varchar2(4000)
,col19 varchar2(4000)
,col20 varchar2(4000)
,col21 varchar2(4000)
,col22 varchar2(4000)
,col23 varchar2(4000)
,col24 varchar2(4000)
,col25 varchar2(4000)
,col26 varchar2(4000)
,col27 varchar2(4000)
,col28 varchar2(4000)
,col29 varchar2(4000)
,col30 varchar2(4000)
) nologging;


create or replace procedure proc1(param1 in number,param2 in number)
as
  type t_tab1 is table of tab1%rowtype index by pls_integer;
  r_tab1  t_tab1;
  k  int;
begin
  k := 0;
  for i in param1..param2 loop  
    k := k + 1;
    r_tab1(k).col1  := i;
    r_tab1(k).col2  := rpad('X',4000,'X');
    r_tab1(k).col3  := rpad('X',4000,'X');
    r_tab1(k).col4  := rpad('X',4000,'X');
    r_tab1(k).col5  := rpad('X',4000,'X');
    r_tab1(k).col6  := rpad('X',4000,'X');
    r_tab1(k).col7  := rpad('X',4000,'X');
    r_tab1(k).col8  := rpad('X',4000,'X');
    r_tab1(k).col9  := rpad('X',4000,'X');
    r_tab1(k).col10 := rpad('X',4000,'X');
    r_tab1(k).col11 := rpad('X',4000,'X');
    r_tab1(k).col12 := rpad('X',4000,'X');
    r_tab1(k).col13 := rpad('X',4000,'X');
    r_tab1(k).col14 := rpad('X',4000,'X');
    r_tab1(k).col15 := rpad('X',4000,'X');
    r_tab1(k).col16 := rpad('X',4000,'X');
    r_tab1(k).col17 := rpad('X',4000,'X');
    r_tab1(k).col18 := rpad('X',4000,'X');
    r_tab1(k).col19 := rpad('X',4000,'X');
    r_tab1(k).col20 := rpad('X',4000,'X');
    r_tab1(k).col21 := rpad('X',4000,'X');
    r_tab1(k).col22 := rpad('X',4000,'X');
    r_tab1(k).col23 := rpad('X',4000,'X');
    r_tab1(k).col24 := rpad('X',4000,'X');
    r_tab1(k).col25 := rpad('X',4000,'X');
    r_tab1(k).col26 := rpad('X',4000,'X');
    r_tab1(k).col27 := rpad('X',4000,'X');
    r_tab1(k).col28 := rpad('X',4000,'X');
    r_tab1(k).col29 := rpad('X',4000,'X');
    r_tab1(k).col30 := rpad('X',4000,'X');
  end loop;
 
  forall  i in 1..(param2 - param1 + 1) 
    insert /*+ APPEND_VALUES */ into tab1 values r_tab1(i);
  commit; 
end;
/

 

declare
i_sta int := 0;
i_end int := 0;
begin
for i in 1..100 loop
  i_sta := i_end + 1;
  i_end := i_sta +10000;
  proc1(i_sta, i_end);
end loop;
end;
/


select sum(bytes/1024/1024/1024) gbytes from user_segments where segment_name = 'TAB1';

 

    GBYTES
----------
122.930664

経過: 00:06:09.11


[1] DROPの場合
drop table tab1 purge;

経過: 00:00:00.94


[2] TRUNCATEの場合
truncate table tab1;

経過: 00:00:00.62

 


(14)

 

\timing 1

drop table tab1;
create UNLOGGED table tab1(
 col1  int
,col2  varchar(4000)
,col3  varchar(4000)
,col4  varchar(4000)
,col5  varchar(4000)
,col6  varchar(4000)
,col7  varchar(4000)
,col8  varchar(4000)
,col9  varchar(4000)
,col10 varchar(4000)
,col11 varchar(4000)
,col12 varchar(4000)
,col13 varchar(4000)
,col14 varchar(4000)
,col15 varchar(4000)
,col16 varchar(4000)
,col17 varchar(4000)
,col18 varchar(4000)
,col19 varchar(4000)
,col20 varchar(4000)
,col21 varchar(4000)
,col22 varchar(4000)
,col23 varchar(4000)
,col24 varchar(4000)
,col25 varchar(4000)
,col26 varchar(4000)
,col27 varchar(4000)
,col28 varchar(4000)
,col29 varchar(4000)
,col30 varchar(4000)
);


insert into tab1
  select g,
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X'),
  rpad('X',4000,'X')
  from generate_series(1,100000) g;

 

do $$
declare
begin
  for i in 1..9 loop
    insert into tab1 select * from tab1;
  end loop;
end
$$
;

SELECT pg_size_pretty(pg_relation_size('tab1'));


 pg_size_pretty
----------------
 98 GB
時間: 1003691.138 ミリ秒(16:43.691)


[1] DROPの場合
drop table tab1;

時間: 1341.362 ミリ秒(00:01.341)

[2] TRUNCATEの場合
truncate table tab1;

時間: 363.536 ミリ秒

 

 

(2019)

 

新しいディスク(300GB)を追加し、復旧モデル=単純でテスト用のDBを作成する。


メッセージ 1105、レベル 17、状態 2、行 7
データベース 'tempdb' にオブジェクト '<temporary system object: 71635381588656128>' の領域を割り当てられませんでした。
'PRIMARY' ファイル グループがいっぱいです。不要なファイルの削除、ファイル グループ内のオブジェクトの削除、ファイル グループへの新しいファイルの追加、またはファイル グループの既存のファイルの自動拡張の設定のいずれかを行ってディスク領域を作成してください。

→ tempdbのデータファイルも追加

 

drop table tab1;
create table tab1(
 col1  int
,col2  varchar(4000)
,col3  varchar(4000)
,col4  varchar(4000)
,col5  varchar(4000)
,col6  varchar(4000)
,col7  varchar(4000)
,col8  varchar(4000)
,col9  varchar(4000)
,col10 varchar(4000)
,col11 varchar(4000)
,col12 varchar(4000)
,col13 varchar(4000)
,col14 varchar(4000)
,col15 varchar(4000)
,col16 varchar(4000)
,col17 varchar(4000)
,col18 varchar(4000)
,col19 varchar(4000)
,col20 varchar(4000)
,col21 varchar(4000)
,col22 varchar(4000)
,col23 varchar(4000)
,col24 varchar(4000)
,col25 varchar(4000)
,col26 varchar(4000)
,col27 varchar(4000)
,col28 varchar(4000)
,col29 varchar(4000)
,col30 varchar(4000)
);

 

insert into tab1
  select row_number() over(order by object_id),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000),
  replicate('X',4000)
  from sys.columns;


begin
set nocount on;
declare @i int;
set @i = 1;
while (@i <= 10)
  begin
  insert into tab1 select * from tab1;
  set @i = @i + 1;
  end
end
go


約2時間

 

EXEC sp_spaceused 'dbo.tab1';
go

122GB

[1] DROPの場合
drop table tab1;

1秒以下

[2] TRUNCATEの場合
truncate table tab1;

1秒以下

 

異種データベースへのDBリンク


(8.0.22)

MySQLは異種DBへのDBリンクをサポートしていない

 


(19c)

Oracle(19c) mmm065(CentOS7) --> PostgreSQL(14) mmm070(CentOS8)
https://blue-red.ddo.jp/~ao/wiki/wiki.cgi?page=Oracle%A4%AB%A4%E9Postgresql%A4%D8ODBC%C0%DC%C2%B3%A4%B9%A4%EB
https://dbaspot.wordpress.com/2013/05/29/how-to-access-postgresql-from-oracle-database/
https://community.oracle.com/tech/developers/discussion/4269392/unable-to-connect-from-oracle-19c-to-postgresql-10-3


前提:PostgreSQLにリモート接続可能

以下すべて、mmm065で実行する

-- 1. PostgreSQLODBCドライバをインストール

yum install -y postgresql-odbc

-- 2. ODBCの設定

vim /etc/odbc.ini

[PG_LINK]
Description = PG_LINK
Driver = /usr/lib64/psqlodbc.so
Servername = mmm070
Username = postgres
Password = postgres
Port = 5432
Database = test
TRACE =Yes
TraceFile = /tmp/sql.log
Debug = 1
CommLog = 1

[Default]
Driver = /usr/lib64/liboplodbcS.so.2

 

-- 3. initSID.oraの編集
su - oracle
vim $ORACLE_HOME/hs/admin/initPG_LINK.ora

HS_FDS_CONNECT_INFO = PG_LINK
HS_FDS_TRACE_LEVEL = on
HS_FDS_SHAREABLE_NAME = /usr/lib64/psqlodbc.so
HS_NLS_NCHAR = UCS2
HS_LANGUAGE = AMERICAN_AMERICA.WE8ISO8859P1
set ODBCINI=/etc/odbc.ini

-- 4. 静的Listenerの追加

vim $ORACLE_HOME/network/admin/listener.ora


LISTENER2=
  (DESCRIPTION=
    (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=mmm65.example.com)(PORT=1522) )
     ) )

SID_LIST_LISTENER2=
   (SID_LIST =
      (SID_DESC=
         (ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1)
         (ENV="LD_LIBRARY_PATH=/u01/app/oracle/product/19.0.0/dbhome_1/lib:/usr/lib64")
         (SID_NAME=PG_LINK)
         (PROGRAM=dg4odbc)
      )
  )

lsnrctl stop LISTENER2
lsnrctl start LISTENER2
lsnrctl status LISTENER2

 

-- 5. tnsnames.oraの編集
vim $ORACLE_HOME/network/admin/tnsnames.ora

PG_LINK =
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=mmm65.example.com)(PORT=1522) )
    (CONNECT_DATA=
      (SERVER = DEDICATED)
      (SID=PG_LINK)
    )
    (HS=OK)
  )


-- 6. データベースリンクの作成

drop public database link PG_LINK;
create public database link PG_LINK connect to "postgres" identified by "postgres" using 'PG_LINK';

-- 7. 動作確認

select * from "tab1"@PG_LINK;

※日本語は文字化けする。回避方法不明

※エラーが出る場合はログを確認する
ログの場所 = /u01/app/oracle/product/19.0.0/dbhome_1/hs/log

行1でエラーが発生しました。:
ORA-28500: OracleからOracle以外のシステムへの接続で次のメッセージが戻されました:  ORA-02063:
先行のエラー・メッセージを参照してくださいline(PG_LINK)。

→このエラーはHS_LANGUAGEを設定で解消する

 

Oracle(19c) mmm065(CentOS7) --> MySQL(8.0.22) mmm066(CentOS7)
https://qiita.com/mossi/items/d2a8c8c113738bee9f2d

前提:MySQLにリモート接続可能

以下すべて、mmm065で実行する

-- 1. unixODBC (ODBC Driver Manager)のインストール

yum install -y unixODBC

odbcinst -j

-- 2. mysql-connector-odbc (MySQLODBCドライバ) のインストール


yum install -y https://dev.mysql.com/get/Downloads/Connector-ODBC/8.0/mysql-connector-odbc-8.0.26-1.el7.x86_64.rpm

cat /etc/odbcinst.ini

-- 3. ODBCの設定

vim /etc/odbc.ini

[MYDB]
Driver     = MySQL ODBC 8.0 Unicode Driver
SERVER     = mmm066
PORT       = 3306
DATABASE   = test
USER       = root
PASSWORD   = password
CHARSET    = utf8

isql MYDB -v

select user();


-- 4. ODBCドライバマネージャーライブラリのパスを確認
ldd `which isql`


-- 5. initSID.oraの編集
su - oracle
vim $ORACLE_HOME/hs/admin/initMYDB.ora

HS_FDS_CONNECT_INFO = MYDB
HS_NLS_NCHAR = UCS2
HS_LANGUAGE = JAPANESE_JAPAN.AL32UTF8
HS_FDS_SHAREABLE_NAME = /lib64/libodbc.so.2

set ODBCINI=/etc/odbc.ini


-- 6. 静的Listenerの追加

vim $ORACLE_HOME/network/admin/listener.ora


LISTENER2=
  (DESCRIPTION=
    (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=mmm65.example.com)(PORT=1523) )
     ) )

SID_LIST_LISTENER2=
   (SID_LIST =
      (SID_DESC=
         (ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1)
         (SID_NAME=MYDB)
         (PROGRAM=dg4odbc)
      )
  )

lsnrctl stop LISTENER2
lsnrctl start LISTENER2
lsnrctl status LISTENER2


-- 7. tnsnames.oraの編集
vim $ORACLE_HOME/network/admin/tnsnames.ora

MYDB =
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=mmm65.example.com)(PORT=1523) )
    (CONNECT_DATA=
      (SERVER = DEDICATED)
      (SID=MYDB)
    )
    (HS=OK)
  )


-- 8. データベースリンクの作成

drop public database link MYDB;
create public database link MYDB connect to "root" identified by "password" using 'MYDB';

-- 9. 動作確認

select * from "tab1"@MYDB;

 

Oracle(19c) mmm065(CentOS7) --> SQL Server(2019) mmm061(Windows Server 2019)
https://ameblo.jp/norinori-monta/entry-12189037036.html
https://tech-oracle.blog.ss-blog.jp/2021-10-10


前提:SQL Serverにリモート接続可能

以下すべて、mmm065で実行する

-- 1. Oracle GatewaySQL Server)のインストール
unzip LINUX.X64_193000_gateways.zip
cd gateways
LANG=C ./runInstaller


Software location: /u01/app/oracle/product/19.0.0/dbhome_1

Oracle Database Gateway for Microsoft SQL Serverにチェック

Microsft SQL Server Database Server Host Name: mmm061
Microsft SQL Server Database Server Port Number: 1433
Microsft SQL Server Server Name: MSSQLSERVER
Microsft SQL Server Database Name: test

ls -ltr $ORACLE_HOME/dg4msql

cat $ORACLE_HOME/dg4msql/admin/initdg4msql.ora


-- 2. 静的Listenerの追加

vim $ORACLE_HOME/network/admin/listener.ora


LISTENER2=
  (DESCRIPTION=
    (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=mmm65.example.com)(PORT=1524) )
     ) )

SID_LIST_LISTENER2=
   (SID_LIST =
      (SID_DESC=
         (ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1)
         (SID_NAME=dg4msql)
         (PROGRAM=dg4msql)
      )
  )

lsnrctl stop LISTENER2
lsnrctl start LISTENER2
lsnrctl status LISTENER2


-- 3. tnsnames.oraの編集
vim $ORACLE_HOME/network/admin/tnsnames.ora

dg4msql =
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=mmm65.example.com)(PORT=1524) )
    (CONNECT_DATA=
      (SERVER = DEDICATED)
      (SID=dg4msql)
    )
    (HS=OK)
  )

tnsping dg4msql


-- 4. データベースリンクの作成

drop public database link dg4msql;
create public database link dg4msql connect to "sa" identified by "password" using 'dg4msql';

-- 5. 動作確認

select * from "tab1"@dg4msql;

 


(14)
PostgreSQL(14) mmm070(CentOS8) --> Oracle(19c) mmm065(CentOS7)
https://lets.postgresql.jp/documents/technical/fdw
https://www.fujitsu.com/jp/products/software/resources/feature-stories/postgres/article-index/oracle-fdw-basic/
https://www.postgresql.org/about/news/oracle_fdw-240-released-2313/

前提:Oracleにリモート接続可能


以下すべて、mmm070で実行する

-- 1. OCIライブラリーのインストール
インスタントクライアントのサイトからrpm版をもってくる

dnf install -y oracle-instantclient19.12-basic-19.12.0.0.0-1.x86_64.rpm
dnf install -y oracle-instantclient19.12-devel-19.12.0.0.0-1.x86_64.rpm
dnf install -y oracle-instantclient19.12-sqlplus-19.12.0.0.0-1.x86_64.rpm


-- 2. 環境変数の設定
su - postgres

export LD_LIBRARY_PATH=/usr/lib/oracle/19.12/client64/lib
export NLS_LANG=JAPANESE_JAPAN.AL32UTF8
export PATH=$PATH:/usr/pgsql-14/bin
export ORACLE_HOME=/usr/lib/oracle/19.12/client64/lib


-- 3. oracle_fdwのエクステンション(EXTENTION)の作成

git clone https://github.com/laurenz/oracle_fdw.git
cd oracle_fdw


make
exit
export PATH=$PATH:/usr/pgsql-14/bin
cd ~postgres/oracle_fdw
make install

su - postgres


psql test
CREATE EXTENSION oracle_fdw;
\dew


-- 4. 外部サーバーの作成
CREATE SERVER ora_sv FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver 'mmm065:1521/pdb1.example.com');
\des+

GRANT USAGE ON FOREIGN SERVER ora_sv TO postgres;


-- 5. ユーザーマップの作成
CREATE USER MAPPING FOR postgres SERVER ora_sv OPTIONS ( USER 'test', PASSWORD 'test');
\deu+

-- 6. 外部テーブルの作成

CREATE FOREIGN TABLE f_tab1(
  col1 int OPTIONS (key 'true'),
  col2 varchar(10) )
SERVER ora_sv OPTIONS (SCHEMA 'TEST' , TABLE 'TAB1');

\det+
\d f_tab1

-- 7. 動作確認

select * from f_tab1;


PostgreSQL(14) mmm070(CentOS8) --> MySQL(8.0.22) mmm066(CentOS7)
https://qiita.com/msrx9/items/734d644b7b2aad796b09

前提:MySQLにリモート接続可能

以下すべて、mmm070で実行する

-- 1. mysql_fdwのエクステンション(EXTENTION)の作成

dnf install -y mysql-devel

su - postgres

export PATH=$PATH:/usr/pgsql-14/bin

git clone https://github.com/EnterpriseDB/mysql_fdw.git

cd mysql_fdw

make USE_PGXS=1

exit
export PATH=$PATH:/usr/pgsql-14/bin
cd ~postgres/mysql_fdw
make USE_PGXS=1 install

su - postgres

psql test
CREATE EXTENSION mysql_fdw;
\dew


-- 2. 外部サーバーの作成
CREATE SERVER mpi_mysql FOREIGN DATA WRAPPER mysql_fdw OPTIONS (
    host 'mmm066',
    port '3306'
);

\des+

GRANT USAGE ON FOREIGN SERVER mpi_mysql TO postgres;


-- 3. ユーザーマップの作成
CREATE USER MAPPING FOR postgres SERVER mpi_mysql OPTIONS (
    username 'root',
    password 'password'
);

\deu+

-- 4. 外部テーブルの作成
CREATE FOREIGN TABLE f_tab1 (
    col1 int,
    col2 varchar(10)
)
SERVER mpi_mysql
OPTIONS (
    dbname 'test',
    table_name 'tab1'
);

\det+
\d f_tab1

-- 5. 動作確認

select * from f_tab1;


PostgreSQL(14) mmm070(CentOS8) --> SQL Server(2019) mmm061(Windows Server 2019)
https://toshtone.hatenablog.jp/entry/2018/05/29/001729

前提:SQL Serverにリモート接続可能

以下すべて、mmm070で実行する

-- 1. tds_fdwのエクステンション(EXTENTION)の作成

dnf install -y epel-release
dnf install -y freetds-devel


su - postgres

git clone https://github.com/tds-fdw/tds_fdw.git
cd tds_fdw

make USE_PGXS=1 PG_CONFIG=/usr/pgsql-14/bin/pg_config
sudo make USE_PGXS=1 PG_CONFIG=/usr/pgsql-14/bin/pg_config install


psql test
CREATE EXTENSION tds_fdw;
\dew

-- 2. 外部サーバーの作成
create server ms_sv foreign data wrapper tds_fdw options (
    servername 'mmm061',
    port '1433',
    database 'test',
    tds_version '4.2',
    character_set 'UTF-8');


\des+

GRANT USAGE ON FOREIGN SERVER ms_sv TO postgres;


-- 3. ユーザーマップの作成
create user mapping for postgres server ms_sv options (username 'sa', password 'password');

\deu+

-- 4. 外部テーブルの作成
create foreign table f_tab1 (
    col1 int,
    col2 varchar(10)
)
server ms_sv options (table 'tab1');


\det+
\d f_tab1

-- 5. 動作確認

select * from f_tab1;

 

 

(2019)
SQL Server(2019) mmm061(Windows Server 2019) --> Oracle(19c) mmm065(CentOS7)
https://qiita.com/shisho/items/31837ad38b8bc7f203b8
https://tech-oracle.blog.ss-blog.jp/2021-10-04

前提:Oracleにリモート接続可能

以下すべて、mmm061で実行する

-- 1. OSユーザ追加
net user
net user oracle password /add

-- 2. Oracle Clientのインストール


使用したインストーラWINDOWS.X64_193000_client.zip

インストールタイプ: 管理者
インストール先ユーザ: oracle
ORACLEBASE: C:\app\oracle
ORACLEHOME: C:\app\oracle\product\19.0.0\client_1

-- 3. tnsnames.oraの設定

cd C:\app\oracle\product\19.0.0\client_1\network\admin

notepad tnsnames.ora
pdb1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mmm065)(PORT = 1521) )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = pdb1.example.com)
    )
  )

tnsping pdb1

-- 4. Oracle OLE DBのプロパティを変更

USE [master]
GO
EXEC master.dbo.sp_MSset_oledb_prop N'OraOLEDB.Oracle', N'AllowInProcess', 1
GO

-- 5. Linked Serverの構成

USE [master]
GO
EXEC master.dbo.sp_addlinkedserver @server = N'PDB1', @srvproduct=N'Oracle', @provider=N'OraOLEDB.Oracle', @datasrc=N'pdb1'


EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'PDB1', @locallogin = NULL , @useself = N'False', @rmtuser = N'test', @rmtpassword = N'test'
GO

 

-- 6. 動作確認

select * from リンクサーバー名..スキーマ名.テーブル名


select * from PDB1..TEST.TAB1;

 

SQL Server(2019) mmm061(Windows Server 2019) --> PostgreSQL(14) mmm070(CentOS8)

https://qiita.com/AkihiroTakamura/items/2da977e9362533611cfc
https://gist.github.com/alg0002/d2fc1b4ede87390478ff1f850b0a3ebd

前提:PostgreSQLにリモート接続可能

以下すべて、mmm061で実行する


-- 1. Postgres ODBC Driverのインストール

使用したインストーラ: psqlodbc_13_02_0000-x64.zip

 

-- 2. Linked Serverの構成

use master;
GO

EXEC MASTER.dbo.sp_addlinkedserver @server = N'pg14'
,@srvproduct = N'PostgreSQL'
,@provider = N'MSDASQL'
,@provstr = 'Driver={PostgreSQL UNICODE};Server=mmm070;Port=5432;Database=test;UID=postgres;Password=postgres;Network=dbmssocn;'


-- 3. 動作確認

select * from リンクサーバー名.データベース名.スキーマ名.テーブル名

select * from pg14.test.[public].tab1;


SQL Server(2019) mmm061(Windows Server 2019) --> MySQL(8.0.22) mmm066(CentOS7)

https://akarui-nippon.com/blog/sql-server%E3%81%8B%E3%82%89mysql%E3%82%92%E8%A6%97%E3%81%8F%EF%BD%9E%E3%83%AA%E3%83%B3%E3%82%AF%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A%EF%BD%9E
https://itfun.jp/2014/10/sql-servermysql.html


前提:MySQLにリモート接続可能

以下すべて、mmm061で実行する


-- 1. MySQL ODBC Driverのインストール

使用したインストーラmysql-connector-odbc-8.0.26-winx64.msi

Visual Studio 2019 x64 Redistributableも必要

 

-- 2. Linked Serverの構成

USE [master]
GO

EXEC master.dbo.sp_addlinkedserver @server = N'MYSQL8'
,@srvproduct=N'MySQL'
,@provider=N'MSDASQL'
,@provstr=N'DRIVER={MySQL ODBC 8.0 UNICODE Driver};SERVER=mmm066;PORT=3306;DATABASE=test;USER=root;PASSWORD=password;OPTION=3;'

 

-- 3. 動作確認

select * from openquery (MYSQL8, 'select * from tab1');

select * from リンクサーバー名.データベース名.スキーマ名.テーブル名

select * from MYSQL8.test..tab1;

 

{S3}Amazon S3 Transfer Acceleration を使用した高速かつ安全なファイル転送の設定

https://dev.classmethod.jp/articles/s3-transfer-acceleration-with-aws-cli/

Transfer Acceleration は仮想ホスト形式のリクエストでのみサポートされます。

 

-- 1. S3 バケットを作成する
export AWS_DEFAULT_REGION=us-east-1

aws s3 mb s3://bucket123
aws s3 ls


-- 2. バケットでの Transfer Acceleration の有効化

aws s3api put-bucket-accelerate-configuration --bucket bucket123 --accelerate-configuration Status=Enabled

-- 3. バケットでの Transfer Acceleration の無効化

aws s3api put-bucket-accelerate-configuration --bucket bucket123 --accelerate-configuration Status=Suspended

-- 4. バケットでの Transfer Acceleration の設定確認

aws s3api get-bucket-accelerate-configuration --bucket bucket123


-- 5. Transfer Acceleration の使用

dd if=/dev/zero of=dummy.100M bs=100k count=1024

-- Transfer Accelerationを使用する場合

time aws s3 cp dummy.100M s3://bucket123/001/  --endpoint-url https://s3-accelerate.amazonaws.com

aws s3 ls s3://bucket123 --recursive

real    0m5.364s
user    0m1.038s
sys     0m0.355s

-- Transfer Accelerationを使用しない場合

time aws s3 cp dummy.100M s3://bucket123/002/

aws s3 ls s3://bucket123 --recursive

real    0m4.555s
user    0m1.053s
sys     0m0.375s

Transfer Accelerationの効果は確認できなかった

-- 6. クリーンアップ
-- バケットの削除
aws s3 rb s3://bucket123 --force
aws s3 ls

{S3}Amazon S3 のデフォルトバケット暗号化の有効化

S3 バケットのデフォルトの暗号化の使用に追加料金はかかりません。

暗号化キータイプ
Amazon S3 キー (SSE-S3)
AWS Key Management Service キー (SSE-KMS) --- AWS 管理キー (aws/s3)
AWS Key Management Service キー (SSE-KMS) --- カスタマ 管理キー


前提:aws-cli/2.2.45

-- 1. S3 バケットを作成する

aws s3 mb s3://bucket123
aws s3 ls

-- 2. デフォルト暗号化の有効化

-- SSE-S3 を使用したデフォルトの暗号化

aws s3api put-bucket-encryption --bucket bucket123 --server-side-encryption-configuration '{
    "Rules": [
        {
            "ApplyServerSideEncryptionByDefault": {
                "SSEAlgorithm": "AES256"
            }
        }
    ]
}'

-- S3 バケットキーを使用した SSE-KMS でのデフォルトの暗号化
aws-cli v1を使用するとエラー

aws s3api put-bucket-encryption --bucket bucket123 --server-side-encryption-configuration '{
    "Rules": [
            {
                "ApplyServerSideEncryptionByDefault": {
                    "SSEAlgorithm": "aws:kms",
                    "KMSMasterKeyID": "arn:aws:kms:ap-northeast-1:999999999999:key/11111111-2222-3333-4444-555555555555"
                },
                "BucketKeyEnabled": true
            }
        ]
    }'


-- 3. デフォルト暗号化の確認
aws s3api get-bucket-encryption --bucket bucket123

-- 4. デフォルト暗号化の無効化
aws s3api delete-bucket-encryption --bucket bucket123


-- 5. クリーンアップ
-- バケットの削除
aws s3 rb s3://bucket123 --force
aws s3 ls

 

{S3}Amazon S3 の開始方法

-- 1. S3 バケットを作成する

aws s3 mb s3://bucket123
aws s3 ls

 

-- 2. バケットにオブジェクトをアップロードする
mkdir work
cd work
echo test01 > test01.txt
mkdir test02
echo test03 > test02/test03.txt
echo test04 > test02/test04.txt

mkdir -p test05/test06
mkdir -p test05/test07

echo test08 > test05/test06/test08.txt
echo test09 > test05/test06/test09.txt
echo test10 > test05/test07/test10.txt
echo test11 > test05/test07/test11.txt

ls -lR

-- 単一ファイルのアップロード(バケット直下)
aws s3 cp test01.txt s3://bucket123

-- 単一ファイルのアップロード(+フォルダ作成)
aws s3 cp test01.txt s3://bucket123/test12/

-- フォルダ内の全ファイルのアップロード(バケット直下)
aws s3 cp test02 s3://bucket123 --recursive

-- フォルダ内の全ファイルのアップロード(+フォルダ作成)
aws s3 cp test02 s3://bucket123/test13 --recursive

-- フォルダ内の全ファイルとフォルダのアップロード(バケット直下)
aws s3 cp test05 s3://bucket123 --recursive

-- フォルダ内の全ファイルとフォルダのアップロード(+フォルダ作成)
aws s3 cp test05 s3://bucket123/test14 --recursive

aws s3 ls s3://bucket123
aws s3 ls s3://bucket123 --recursive


-- 3. オブジェクトをダウンロードする
cd

-- 単一ファイルのダウンロード
aws s3 cp s3://bucket123/test12/test01.txt .

-- フォルダ内の全ファイルのダウンロード
aws s3 cp  s3://bucket123/test13 . --recursive

-- フォルダ内の全ファイルとフォルダのダウンロード
aws s3 cp  s3://bucket123/test14 . --recursive

ls -lR

-- 4. オブジェクトをフォルダにコピーする

-- 単一ファイルのコピー
aws s3 cp s3://bucket123/test12/test01.txt s3://bucket123/test15/test16.txt

-- フォルダ内の全ファイルのコピー
aws s3 cp s3://bucket123/test13  s3://bucket123/test17 --recursive

-- フォルダ内の全ファイルとフォルダのコピー
aws s3 cp s3://bucket123/test14  s3://bucket123/test18 --recursive

aws s3 ls s3://bucket123
aws s3 ls s3://bucket123 --recursive


-- 5. オブジェクトとバケットを削除する

-- 単一ファイルの削除
aws s3 rm s3://bucket123/test15/test16.txt

-- フォルダ内の全ファイルの削除
aws s3 rm s3://bucket123/test17 --recursive

-- フォルダ内の全ファイルとフォルダの削除
aws s3 rm s3://bucket123/test18 --recursive

-- バケットの削除
aws s3 rb s3://bucket123 --force