Migration to MariaDB from Oracle

Oracle 데이터베이스에서 MariaDB / MySQL / Percona 서버로 데이터 이행을 해야 할때가 있습니다. 테이블 스키마들의 구조들을 일부 변경을 해줘야 하고, 데이터들의 column data type들에 따라서 여러 방법들을 사용할 수 있습니다.
ETL 툴들을 이용하기도 하고 client 프로그램을 이용해서 데이터 마이그레이션을 할 수 있습니다.

MariaDB 본사에 관련해서 문의를 해 보니 sqlines를 이용하라고 권고를 받았습니다.
해당 프로그램은 오픈소스(Apache License 2.0)입니다.
자세한 내용은 아래 홈페이지와 github을 통해서 확인 할 수 있습니다.
http://www.sqlines.com/
https://github.com/dmtolpeko/sqlines

sqlines를 이용해서 schema를 마이그레이션하고 sqldata로 데이터를 마이그레이션 합니다.
sqldata로 schema도 할 수 있지만, 이기종간에 schema 변환이 필요한 경우가 있어서 나눠서 진행하는것이 좋겠습니다.

sqldata는 windows / linux 배포판이 있습니다. windows에서는 GUI를 통해서 편하게 작업을 할 수 있습니다. linux에서는 cfg 설정과 command를 이용해서 마이그레이션을 할 수 있습니다.

아래는 linux에서 sqldata를 command 방식으로 마이그레이션을 하는 예입니다.
– Oracle과 MariaDB / MySQL client를 설정
– sqldata.cfg 설정
– sqldata 실행

# export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib/:/usr/local/mysql/lib
# sed -i 's/-fetch_lob_as_varchar=/-fetch_lob_as_varchar=yes/g' sqldata.cfg
# sqldata -sd=oracle,scott/tiger@192.168.100.101:1521/orcl -td=mysql,ohnew/**password**@192.168.0.182:3306,t1 -t=*

Advertisements

MariaDB Connect engine JDBC 연결 사용하기

MariaDB에서 이기종 데이터베이스를 사용하기 위해서 Connect 엔진을 사용합니다.

connect 엔진에 대한 MariaDB의 웹페이지는 아래를 참고하시면 됩니다.

https://mariadb.com/kb/en/library/connect/

 

connect 엔진을 이용해서 이기종 데이터 베이스를 연결할때 ODBC를 사용을 했습니다.

JDBC를 사용하기 위해서는 10.2.2 / 10.1.17 / 10.0.27 이상의 버전을설치하면 됩니다.

JDBC를 사용하는 방법은 아래 웹페이지를 참고합니다.

https://mariadb.com/kb/en/library/connect-jdbc-table-type-accessing-tables-from-another-dbms/

 

해당 웹페이지만으로 실제 사용하기에는 쉽지 않아서 아래 테스트를 한 내용을 정리해 봅니다.

먼저 MariaDB JDBC connector를 이용해서 같은 서버의 MariaDB를 JDBC로 연결해서 사용하는 방법은 아래와 같습니다.

  • JRE 설치
  • my.cnf 설정 : connect_jvm_path, connect_class_path
  • mariadb start
  • connect 엔진 global variables 확인
  • create table

# apt-get install default-jre

# vi my.cnf
##### connect engine
connect_jvm_path="/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server"
connect_class_path="/ohnew/mariadb/connect/mariadb-java-client-2.2.3.jar"

# systemctl start mariadb

MariaDB> show global variables like 'conn%path';

MariaDB> create table jt_t1 engine=connect table_type=jdbc tabname=t1 connection='jdbc:mariadb://localhost:3306/ohnew' option_list="User=root,Password=";

 

아래는 다른 서버에 있는 oracle 데이터베이스를 JDBC로 연결해서 사용하는 방법입니다.

  • my.cnf 설정 : connect_jvm_path, connect_class_path
  • mariadb start
  • create server
  • create table

# vi my.cnf
##### connect engine
connect_jvm_path="/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server"
connect_class_path="/ohnew/mariadb/connect/ojdbc6.jar"

# systemctl start mariadb

MariaDB> create server 'oracle' foreign data wrapper 'oracle' options (
HOST 'jdbc:oracle:thin:@192.168.100.101:1521:orcl',
DATABASE 'ORCL',
USER 'system',
PASSWORD 'manager',
PORT 0,
SOCKET '',
OWNER 'SYSTEM');

MariaDB> create table jt_ora_t1 engine=connect table_type=JDBC connection='oracle/ohnew.t1' SRCDEF='select c1 from ohnew.t1';

mysql CLI에서 pager 사용

MariaDB를 운영하면서 많이 사용하는것이 mysql CLI 입니다.
해당 프로그램을 이용하면서 pager 명령을 사용하면 운영 효율을 높일 수 있습니다.

관련해서 아래 percona 웹페이지를 참고하시면 도움이 됩니다.

https://www.percona.com/blog/2013/01/21/fun-with-the-mysql-pager-command/

 

replication slave 모니터링과 processlist 모니터링 할 때 사용하면 좋을 듯 해서 pager 명령을 이용해 봤습니다.

mysql> pager egrep "Master_Host|Running|Master_Log|Seconds|Err"
PAGER set to 'egrep "Master_Host|Running|Master_Log|Seconds|Err"'

mysql> show slave status\G
                  Master_Host: 192.168.0.4
              Master_Log_File: mysql-binary.000338
          Read_Master_Log_Pos: 61277405
        Relay_Master_Log_File: mysql-binary.000209
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
                   Last_Errno: 0
                   Last_Error:
          Exec_Master_Log_Pos: 43048968
        Seconds_Behind_Master: 72189
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
      Slave_SQL_Running_State: update
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
1 row in set (0.00 sec)
mysql> pager grep -v 'Sleep'
PAGER set to 'grep -v 'Sleep''

mysql> show processlist;
+----+-------------+----------------------+------+---------+-------+----------------------------------+------------------+-----------+---------------+
| Id | User        | Host                 | db   | Command | Time  | State                            | Info             | Rows_sent | Rows_examined |
+----+-------------+----------------------+------+---------+-------+----------------------------------+------------------+-----------+---------------+
|  8 | root        | localhost            | NULL | Query   |     0 | starting                         | show processlist |         0 |             0 |
| 12 | system user |                      | NULL | Connect | 16695 | Waiting for master to send event | NULL             |         0 |             0 |
| 13 | system user |                      | lol  | Connect | 70183 | starting                         | BEGIN            |         0 |             0 |
+----+-------------+----------------------+------+---------+-------+----------------------------------+------------------+-----------+---------------+
4 rows in set (0.00 sec)

 

MariaDB Sequence Storage Engine

MariaDB에 Sequence Storage Engine이라는것이 있습니다.

MySQL에는 없고 MariaDB에만 있는것으로 알고 있습니다.

Sequence엔진에 대한 자세한 사항은 아래 MariaDB 웹페이지를 참고하면 됩니다.

https://mariadb.com/kb/en/library/sequence-storage-engine/

해당 엔진은 read-only이고 transaction과 XA를 지원한다고 합니다.

show engines를 이용해서 확인해보면 엔진 comment는 아래와 같습니다.

Generated tables filled with sequential values

위 웹페이지를 통해서 간단한 사용예들을 알 수 있습니다.

아래는 sequence storage engine을 이용한 쿼리입니다.

MariaDB [ohnew]> select a.seq,
->  cast(a.seq/10 as int) as seq_1,
->  now() + interval a.seq day as seq_dt,
->  right(concat('000',a.seq),4) as seq_chr,
->  (cast(a.seq as int) + cast(b.seq as int)) * -1  as seq_desc,
->  b.seq as seq_b
-> from seq_10_to_100_step_10 as a
-> join seq_3_to_1 as b;
+-----+-------+---------------------+---------+----------+-------+
| seq | seq_1 | seq_dt              | seq_chr | seq_desc | seq_b |
+-----+-------+---------------------+---------+----------+-------+
|  10 |     1 | 2018-03-31 14:56:24 | 0010    |      -13 |     3 |
|  10 |     1 | 2018-03-31 14:56:24 | 0010    |      -12 |     2 |
|  10 |     1 | 2018-03-31 14:56:24 | 0010    |      -11 |     1 |
|  20 |     2 | 2018-04-10 14:56:24 | 0020    |      -23 |     3 |
|  20 |     2 | 2018-04-10 14:56:24 | 0020    |      -22 |     2 |
|  20 |     2 | 2018-04-10 14:56:24 | 0020    |      -21 |     1 |
|  30 |     3 | 2018-04-20 14:56:24 | 0030    |      -33 |     3 |
|  30 |     3 | 2018-04-20 14:56:24 | 0030    |      -32 |     2 |
|  30 |     3 | 2018-04-20 14:56:24 | 0030    |      -31 |     1 |
|  40 |     4 | 2018-04-30 14:56:24 | 0040    |      -43 |     3 |
|  40 |     4 | 2018-04-30 14:56:24 | 0040    |      -42 |     2 |
|  40 |     4 | 2018-04-30 14:56:24 | 0040    |      -41 |     1 |
|  50 |     5 | 2018-05-10 14:56:24 | 0050    |      -53 |     3 |
|  50 |     5 | 2018-05-10 14:56:24 | 0050    |      -52 |     2 |
|  50 |     5 | 2018-05-10 14:56:24 | 0050    |      -51 |     1 |
|  60 |     6 | 2018-05-20 14:56:24 | 0060    |      -63 |     3 |
|  60 |     6 | 2018-05-20 14:56:24 | 0060    |      -62 |     2 |
|  60 |     6 | 2018-05-20 14:56:24 | 0060    |      -61 |     1 |
|  70 |     7 | 2018-05-30 14:56:24 | 0070    |      -73 |     3 |
|  70 |     7 | 2018-05-30 14:56:24 | 0070    |      -72 |     2 |
|  70 |     7 | 2018-05-30 14:56:24 | 0070    |      -71 |     1 |
|  80 |     8 | 2018-06-09 14:56:24 | 0080    |      -83 |     3 |
|  80 |     8 | 2018-06-09 14:56:24 | 0080    |      -82 |     2 |
|  80 |     8 | 2018-06-09 14:56:24 | 0080    |      -81 |     1 |
|  90 |     9 | 2018-06-19 14:56:24 | 0090    |      -93 |     3 |
|  90 |     9 | 2018-06-19 14:56:24 | 0090    |      -92 |     2 |
|  90 |     9 | 2018-06-19 14:56:24 | 0090    |      -91 |     1 |
| 100 |    10 | 2018-06-29 14:56:24 | 0100    |     -103 |     3 |
| 100 |    10 | 2018-06-29 14:56:24 | 0100    |     -102 |     2 |
| 100 |    10 | 2018-06-29 14:56:24 | 0100    |     -101 |     1 |
+-----+-------+---------------------+---------+----------+-------+
30 rows in set (0.00 sec)

MariaDB / MySQL 소개 및 가이드 문서

회사에서 배포하던 문서들을 slideshare에 공개 했습니다.
https://www.slideshare.net/ohnew/presentations

1월에 올린 자료들은 아래와 같습니다.

* presentations
– MariaDB 소개
– MariaDB 10.2 소개 및 구축사례
– Percona 소개
– MariaDB HA 솔루션
– database proxy (MariaDB, MySQL, Percona)
– MMM (Multi-Master Replication Manager)
– MHA (Master High Availability Manager and tools for MySQL) 가이드
– Galera cluster 표준 제안서
– MySQL / MariaDB 암호화 (TDE)

* documents
– Enterprise open source databases
– XtraBackup 가이드
– MySQL NDB cluster 가이드

Enterprise Open Source Database 비교

작년에 MariaDB에서 엔터프라이즈 오픈소스 데이터베이스에 대해서 비교한 자료가 있었습니다. 한글로 번역한것이 있어서 공유합니다.

 

오픈소스 데이터베이스들은 subscription 정책으로 엔터프라이즈 기능들을 제공합니다. 비교 대상으로는 MariaDB 10.3 / MySQL Enterprise / Enterprise DB Postgres 제품들입니다.

MariaDB에서 만든 문서이기에 MariaDB가 좋은 관점으로 쓰여 있습니다.

MariaDB가 10.3부터 오라클 데이터베이스의 마이그레이션을 중점으로 기능을 추가하고 있어서 해당 비교도 오라클 호환성 관련한 내용이 많습니다.

 

Percona 서버 엔진별 파일 크기 비교

Percona Server for MySQL 5.7.20 서버에 MyRocks 엔진이 GA 되어서 InnoDB와 TokuDB하고 파일 사이즈를 비교해 봤습니다.

 

아래 테이블을 만들어서 2,621,440 rows를 insert 했습니다.

CREATE TABLE oi_rocksdb (
c1 bigint(20) NOT NULL AUTO_INCREMENT,
c2 datetime DEFAULT NULL,
c3 varchar(20) DEFAULT NULL,
PRIMARY KEY (c1)
) ENGINE=ROCKSDB

 

데이터 파일 크기를 비교해 보면 아래와 같습니다.

InnoDB 159,383,552 100%
InnoDB Compressed 75,497,472 47%
TokuDB fast 33,554,432 21%
TokuDB small 16,777,216 11%
RocksDB 18,718,486 12%

 

InnoDB에 비해서 MyRocks엔진의 데이터 파일 크기가 12%입니다. 압축률이 좋긴하네요.

압축률이 제일 좋은것인 TokuDB의 row_format을 small로 사용하느것입니다.

InnoDB 압축을 사용하면 50%가량의 파일 사이즈를 줄일 수 있지만 TokuDB나 RocksDB의 압축이 월등히 좋습니다.

안정성으로 보면 MyRocks엔진은 아직 검증이 많이 안되서 TokuDB를 사용하는게 좋겠습니다.

MariaDB 10년

linkedin에 Michael Monty Widenius ( https://www.linkedin.com/in/montywi/ )가 MariaDB 10년이라고 올라왔습니다.

MariaDB가 10년이 된거네요.

wikipedia를 찾아보니 “On 16 January 2008, MySQL AB announced that it had agreed to be acquired by Sun Microsystems for approximately $1 billion. ” 이런 내용이 있네요.

https://en.wikipedia.org/wiki/MariaDB

 

MySQL도 찾아 봤습니다.

https://en.wikipedia.org/wiki/MySQL

 

Percona는 2006년에 시작을 했네요.

https://en.wikipedia.org/wiki/Percona_Server_for_MySQL

 

Percona 5.7.20 서버 MyRocks 설치

Percona Server for MySQL 5.7.20에서 MyRocks 엔진이 GA로 나왔다고 해서 설치를 해 봤습니다.

설치 이후에 기본 엔진으로 올라 오지는 않습니다.

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| TokuDB | YES | Percona TokuDB Storage Engine with Fractal Tree(tm) Technology | YES | YES | YES |
| InnoDB | DEFAULT | Percona-XtraDB, Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+

MyRocks 설치는 아래와 같이 할 수 있습니다.

mysql> install plugin rocksdb soname 'ha_rocksdb.so';
Query OK, 0 rows affected (2.03 sec)

 

확인은 show engines 이용해서 할 수 있습니다.

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
| ROCKSDB | YES | RocksDB storage engine | YES | YES | YES |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| TokuDB | YES | Percona TokuDB Storage Engine with Fractal Tree(tm) Technology | YES | YES | YES |
| InnoDB | DEFAULT | Percona-XtraDB, Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+