Setup Slave Replikasi MySQL Database dengan Percona XtraBackup


logo mysqlMenyiapkan slave untuk replikasi MySQL database dengan Percona XtraBackup sangat mudah dan simple. Dengan menggunkan tool dari Percona ini database master tidak perlu dilock ataupun dimatikan. Yang perlu disiapkan adalah :

  1. Server MySQL Database yang akan dijadikan master dengan IP Address misalnya : 192.168.1.1 dan konfigurasi
    • MySQL bisa berkomunikasi dengan server lain dengan port standar TCP/IP
    • Percona xtrabackup telah diinstall -> langkahnya
    • User dengan privileges replication slave sudah tersedia
      mysql> CREATE USER 'repl'@'192.168.1.2' IDENTIFIED BY 'slavepass';
      mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.2';
    • Binlog dan server-id telah disetup di file my.cnf atau my.ini
      [sugeng@192.168.1.1 ~]$ vi /etc/my.cnf
      log-bin = /var/lib/mysql/mysql-bin
      server-id = 1
  2. Server MySQL Database yang akan dijadikan slave dengan IP Address misalnya : 192.168.1.2 dan konfigurasi
    • MySQL bisa berkomunikasi dengan server lain dengan port standar TCP/IP
    • server-id telah disetup di file my.cnf atau my.ini
      [sugeng@192.168.1.2 ~]$ vi /etc/my.cnf
      server-id = 2

 

Kemudian langkah-langkahnya adalah

Langkah I : Menyiapkan Backup di server master

[sugeng@192.168.1.1 ~]$  innobackupex --user=yourDBuser --password=MaGiCdB1 /var/lib/mysql.backup/
Setelah selesai akan muncul pesan
innobackupex: completed OK!

Maka akan terbuat sebuah file backup di /var/lib/mysql.backup/$TIMESTAMP. Agar file backup konsisten maka perlu mempersiapkan data:

[sugeng@192.168.1.1 ~]$  innobackupex --user=yourDBuser --password=MaGiCdB1 --apply-log /var/lib/mysql.backup/$TIMESTAMP

Langkah II : Mencopykan file backup ke server slave

[sugeng@192.168.1.1 ~]$  innobackupex --user=yourDBuser --password=MaGiCdB1 --apply-log /var/lib/mysql.backup/$TIMESTAMP

Kopikan file backup dari server master ke datadir mysql slave

[sugeng@192.168.1.1 ~]$ scp -r /var/lib/mysql.backup/$TIMESTAMP sugeng@192.168.1.2:/var/lib/mysql/

Langkah III : Start Slave
lihat posisi binlog, untuk dijadikan acuan MASTER_LOG_FILE dan MASTER_LOG_POS slave ketika start

[sugeng@192.168.1.1 ~]$ cat /var/lib/mysql/xtrabackup_binlog_info

konfigurasi slave

mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.1', MASTER_USER='repl', MASTER_PASSWORD='slavepass', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=245;

Start slave

mysql> START SLAVE;

Cek slave

mysql> SHOW SLAVE STATUS;

MariaDB 5.5.33a Dengan Galera Cluster


galera_overview

Turunan MySQL MariaDB dengan varian cluster Galera, yaitu versi MariaDB Galera Cluster 5.5.33a telah tersedia, Edisi ini mendukung sinkronus replikasi multi master atau “synchronous Multi Master Replication” yang memungkinkan baca dan tulis pada basis data di semua simpul.

MariaDB adalah turunan basis data Oracle MySQL, namun menerapkan lisensi bebas GNU/GPL. Nama MariaDB diturunkan dari nama putri ketiga Michael “Monty” Widenius, pendiri Monty Program dan MySQL. MariaDB memiliki banyak fitur yang sejak lama telah dipelihara komunitas sehingga menurut Monty seharusnya sangat stabil.

MariaDB telah mengganti InnoDB dengan XtraDB yang juga telah mendapat perbaikan dari Google dan Percona. XtraDB diklaim secara signifikan bisa jalan lebih cepat dibandingkan InnoDB, disamping ia juga bisa digunakan tanpa perlu memasang Plugin seperti halnya pada MySQL.

Bersama dengan peluncuran MariaDB Galera Clusters 5.5.33a, Yayasan MariaDB meningkatkan portofolionya dengan fitur “synchronous Multi Master Replication”. Untuk itu, pengembang MariaDB telah menginplementasikan teknologi “Galera Cluster” yang dikembangkan oleh Codership dan ditanamkan langsung di sistem pengelolaan basis data MariaDB. Solusi ini memungkinkan replikasi terselaraskan (synchronous replication) dengan topologi Multi Master. Proses membaca dan menulis di basis data dapat dilakukan di semua simpul, dimana sistem ini juga secara otomatis dapat mendeteksi simpul-simpul yang tidak terjangkau dan mengabaikannya dari Cluster. Sebelumnya di sistem MariaDB hanya tersedia fitur “semi-synchronous Replication“.

MariaDB Galera Cluster 5.5.33a diterbitkan dibawah naungan lisensi bebas GNU/GPL. Paket binari, termasuk kode sumbernya dapat langsung diunduh dari situs pengembangnya. Serupa dengan produk komersial lainnya, dukungan untuk perusahan tersedia antara lain dari SkySQL, perusahan pendukung yang didirikan oleh mantan pimpinan dan investor MySQL AB yang sebelumnya.

Link Download : https://downloads.mariadb.org/mariadb/5.5.33a/

FEDERATE Storage Engine MySQL


FEDERATED storage engine sudah ada sejak MySQL 5.0.3. Merupakan storage engine yang bisa mengakses data pada remote database (kaya DB link kalo di Oracle), jadi tanpa harus melakukan replikasi maupun clustering. Ketika table menggunakan FEDERATED storage engine maka query pada table tersebut otomatis akan mengeksekusi pada remote table (federated).

Untuk menyertakan FEDERATED storage engine pada saat buid MySQL dari Source,
pastikan menyertakan opsi –with-federated-storage-engine

Contoh Penggunaan
Host MySQL Server A : 172.17.1.23 (tanpa harus support FEDERATED)
Db MySQL Server A : test
Table MySQL Server A : test (sebarang storage engine)

Host MySQL Server B : 172.17.1.61 (harus support FEDERATED)
Db MySQL Server B : test
Table MySQL Server B : test_federated (FEDERATE storage engine)


-- ON Db MySQL Server A
CREATE TABLE test (
id INT(20) NOT NULL AUTO_INCREMENT,
NAME VARCHAR(32) NOT NULL DEFAULT '',
other INT(20) NOT NULL DEFAULT '0',
PRIMARY KEY (id),
INDEX NAME (NAME),
INDEX other_key (other)
)
ENGINE=MYISAM
DEFAULT CHARSET=latin1;

insert into `test_table` (`id`, `name`, `other`) values('1','Sugeng','2');
insert into `test_table` (`id`, `name`, `other`) values('2','Sugeng lagi','4');
insert into `test_table` (`id`, `name`, `other`) values('3','Sugeng lagi lagi','5');
-- 3 record dientrikan
-- berikan hak akses user sugeng untuk select ke table tersebut dari Db MySQL Server B

Sekarang kita buat table test_federated pada server B

-- On Db MySQL Server B
CREATE TABLE federated_table (
id INT(20) NOT NULL AUTO_INCREMENT,
NAME VARCHAR(32) NOT NULL DEFAULT '',
other INT(20) NOT NULL DEFAULT '0',
PRIMARY KEY (id),
INDEX NAME (NAME),
INDEX other_key (other)
)
ENGINE=FEDERATED
DEFAULT CHARSET=latin1
CONNECTION='mysql://sugeng:sugeng@172.17.1.23:3306/test/test_table';

mysql> select * from federated_table;
+----+------------------+-------+
| id | name | other |
+----+------------------+-------+
| 1 | Sugeng | 2 |
| 2 | Sugeng lagi | 4 |
| 3 | Sugeng lagi lagi | 5 |
+----+------------------+-------+
3 rows in set (0.00 sec)

3 record tersebut sebenarnya data pada remote Server (DB MySQL Server B)

MySQL: Repair dan Optimize semua tabel pada semua Database


Tabel pada MySQL dapat crash dengan mudah, terutama ketika server anda tiba-tiba mati, atau ketika anda sedang memaksa untuk mencopy data ketika itu table masih sedang diakses.
Untungnya, ada perintah sederhana untuk secara otomatis memeriksa, memperbaiki dan mengoptimalkan semua tabel pada semua database ketika anda menjalankan server MySQL di Linux atau Unix atau BSD.

[database@db ~]$ mysqlcheck -u root -p --auto-repair --check --optimize --all-databases

mysqlcheck tersedia sejak MySQL 3.23.38. 

MySQL EVENT Scheduler


Kadang dalam sebuah aplikasi web membutuhkan sebuah query yang harus dijalankan secara periodic, misalkan setiap satu bulan sekali, Mungkin kalau pengguna LINUX bisa pake JOB CRON kalau di WINDOWS pake Schedule Task. Di MySQL versi 5.1 fitur tersebut telah ada, istilahnya adalah Event Scheduler.
Sebelum memulai membuat sebaik nya dilihat dulu apakah feature schedule nya hidup atau tidak, cara memeriksa nya

SHOW VARIABLES LIKE ‘event_scheduler’

+—————–+——-+
| Variable_name | Value |
+—————–+——-+
| event_scheduler | ON |
+—————–+——-+
1 row in set (0.02 sec)

Untuk menghidupkan MySQL Event Schedule ketikan perintah dibawah ini

SET GLOBAL event_scheduler = 1;

dan untuk mematikan nya

SET GLOBAL event_scheduler = 0;

MySQL Event Schedule terdiri dari beberapa macam, antara lain di bawah ini, sebelum mulai saya akan membuat sebuat tabel terlebih dahulu untuk keperluan demo Event Schedule ini

CREATE TABLE schedule_table (
no int(11) NOT NULL AUTO_INCREMENT,
des varchar(255) DEFAULT NULL,
time datetime NOT NULL,
PRIMARY KEY (no)
) 

1. EVENT SCHEDULER Berdasarkan tanggal dan waktu yg sudah di tentukan

CREATE EVENT event_name
ON SCHEDULE
AT {DATE AND TIME)
DO
{SQL COMMAND};

contoh di bawah ini membuat insert data ke schedule_table pada tgl 1 juni 2009 jam 18:06:49

CREATE EVENT event_name_1
ON SCHEDULE AT ‘2009-06-01 18:06:49’
DO insert into schedule_table values (null, ‘sch 1’, now());

hasilnya:

select * from schedule_table;
+—-+——-+———————+
| no | des | time |
+—-+——-+———————+
| 1 | sch 1 | 2009-06-01 18:06:49 |
+—-+——-+———————+

2. EVENT SCHEDULER berdasarkan pengulangan waktu

CREATE EVENT event_name
ON SCHEDULE
EVERY {x}
{SECOND | MINUTE | HOUR | DAY | MONTH | YEAR | WEEK}
DO
{SQL COMMAND};

contoh dibawah ini akan melakukan insert data ke tabel schedule_table setiap satu menit

CREATE EVENT event_name_2
ON SCHEDULE EVERY 1 MINUTE
DO insert into schedule_table values (null, ‘sch 2’, now());

Hasilnya
+—-+——-+———————+
| no | des | time |
+—-+——-+———————+
| 2 | sch 2 | 2009-06-01 18:16:27 |
| 3 | sch 2 | 2009-06-01 18:17:27 |
| 4 | sch 2 | 2009-06-01 18:18:27 |
| 5 | sch 2 | 2009-06-01 18:19:27 |
| 6 | sch 2 | 2009-06-01 18:20:27 |
| 7 | sch 2 | 2009-06-01 18:21:27 |
| 8 | sch 2 | 2009-06-01 18:22:27 |
| 9 | sch 2 | 2009-06-01 18:23:27 |
| 10 | sch 2 | 2009-06-01 18:24:27 |
| 11 | sch 2 | 2009-06-01 18:25:27 |
+—-+——-+———————+
10 rows in set (0.01 sec)

untuk EDIT event schedule, formatnya di bawah ini

ALTER EVENT event_name
[ ON SCHEDULE schedule ]
[ RENAME TO event_name2 ]
[ DO sql_statement ]

contoh dibawah ini akan mengubah nama schedule dari event_name_2 ke event_name_3

ALTER EVENT event_name_2
ON SCHEDULE EVERY 2 MINUTE
RENAME TO event_name_3
DO insert into schedule_table values (null, ‘sch 3’, now());

untuk HAPUS event schedule formatnya seperti dibawah ini

DROP EVENT event_name ;

contoh dibawah ini adalah menghapus schedule event_name_3

DROP EVENT event_name_3;

untuk melihat list event schedule yg ada pada database kita, cara dibawah ini

SELECT * FROM mysql.event\G
*************************** 1. row ***************************

db: test
name: event_name_1
body: insert into schedule_table values (null, ‘sch 1’, now())
definer: root@localhost
execute_at: 2009-07-01 11:06:49
interval_value: NULL
interval_field: NULL
created: 2009-06-04 18:03:54
modified: 2009-06-04 18:03:54
last_executed: NULL
starts: NULL
ends: NULL
status: ENABLED
on_completion: DROP
sql_mode:
comment:
originator: 1
time_zone: SYSTEM
character_set_client: latin1
collation_connection: latin1_swedish_ci
db_collation: latin1_swedish_ci
body_utf8: insert into schedule_table values (null, ‘sch 1’, now())
1 row in set (0.00 sec)


ORA-01720: grant option does not exist for…


Hi,

Mungkin anda mendapatkan error ini karena grant yang hilang.

Nah, jika anda ingin untuk memberikan grant pada view,  dan view ini mengacu pada Table1 dan Tabel2

User skema (owner of view) telah melakukan grant untuk table1 tetapi tidak untuk table2.

Jadi, Anda harus memberikan grant kepada user skema di table2 dengan grant option:

grant _PRIVILEGE_ on _TABLE_ to _SCHEMA_USER_ with grant option;

atau

Anda memiliki role melakukan grant untuk sebuah objek, tetapi prosedur yang anda miliki menimbulkan kesalahan ketika dijalankan.
Itu karena anda harus memiliki hak istimewa itu sendiri (schema_user: pemilik objek), tidak inherited oleh role:

grant _PRIVILEGE_ on _TABLE_ to _SCHEMA_USER_;

Session Cursor Cache hit vs. Soft Parses vs. Hard Parses


Jika Anda menjalankan query ini ke DataBase Oracle, Anda akan melihat perilaku sistem caching kursor yang oracle lakukan.

Jumlah dari ketiga nilai pada kolom harus 100%


select
to_char(100 * sess / calls, '999999999990.00') || '%' cursor_cache_hits,
to_char(100 * (calls - sess - hard) / calls, '999990.00') || '%' soft_parses,
to_char(100 * hard / calls, '999990.00') || '%' hard_parses
from
( select value calls from v$sysstat where name = 'parse count (total)' ),
( select value hard from v$sysstat where name = 'parse count (hard)' ),
( select value sess from v$sysstat where name = 'session cursor cache hits' )
/

Jika nilai dari kolom pertama adalah di bawah 80% maka Anda harus meningkatkan nilai parameter session_cached_cursors.

Flush-host di MySQL


Mungkin banyak dari anda yang telah bertemu dengan masalah maksimal koneksi MySQL dan anda perlu melakukan flush-host. Tutorial ini akan menjelaskan bagaimana untuk melakukannya.

Pertama Anda harus memiliki user admin dari server MySQL anda. Dalam kebanyakan kasus itu adalah root. Login melalui SSH dan jalankan perintah berikut:

$ mysqladmin -u root -p flush-host

Mengapa itu terjadi? Sebagian besar itu terjadi karena 2 alasan:

  • Script anda tidak menutup koneksi ke MySQL setelah mereka selesai.
  • MySQL memungkinkan 250 koneksi secara default. Jika hal ini tidak cukup untuk kebutuhan anda, anda dapat mengedit /etc/my.cnf dan meningkatkan nilai maksimal koneksi.