Anda di halaman 1dari 162

MySQL Database Administration

versi 1.0 (Maret) 2015

MySQL Database
Administration Fundamental
and Advanced

Yusuf Hadiwinata Sutandar


Version: 1.0
2015
Page 1

MySQL Database Administration

versi 1.0 (Maret) 2015

KATA PENGANTAR
MySQL merupakan software database open source yang paling populer di dunia,
dimana saat ini digunakan lebih dari 100 juta pengguna di seluruh dunia. Dengan
kehandalan, kecepatan dan kemudahan penggunaannya, MySQL menjadi pilihan utama
bagi banyak pengembang software dan aplikasi baik di platform web maupun desktop.
Pengguna MySQL tidak hanya sebatas pengguna perseorangan maupun perusahaan
kecil, namun perusahaan seperti Yahoo!, AlcatelLucent, Google, Nokia, Youtube,
Wordpress dan Facebook juga merupakan pengguna MySQL.
MySQL pertama kali dibuat dan dikembangkan di Swedia, yaitu oleh David Axmark,
Allan Larsson dan Michael "Monty" Widenius. Mereka mengembangkan MySQL sejak
tahun 1980an. Saat ini versi MySQL yang sudah stabil mencapai versi 5x, dan sedang
dikembangkan versi 6x. Untuk lebih lengkapnya dapat dilihat di situs resmi MySQL1.
Materi ini mencoba membahas MySQL secara praktis, disajikan secara terstruktur
dan disertai contohcontoh dan latihan untuk membantu pemahaman. Sehingga
diharapkan dapat membantu Student menguasai MySQL hingga mahir. Buku ini sangat
cocok bagi student yang baru mempelajari MySQL maupun bagi student yang ingin lebih
memperdalam MySQL sebagai salah satu software database terkemuka saat ini. Buku ini
terbagi menjadi 4 (empat) bagian. Bagian pertama merupakan bagian pendahuluan yang
membahas mengenai penjelasan singkat MySQL dan juga langkah instalasi MySQL serta
software pendukung lainnya. Bagian kedua adalah Dasardasar MySQL yang menjelaskan
mengenai perintahperintah dasar dari MySQL termasuk fungsifungsi di dalam MySQL.
Pada bagian ketiga dipaparkan mengenai perintahperintah MySQL yang lebih kompleks
seperti penggabungan antar tabel, trigger, views dan stored procedure. Selanjutnya pada
bagian yang terakhir akan dijelaskan mengenai penyajian laporan dan proses backup,
restore database MySQL.

Page 2

MySQL Database Administration

versi 1.0 (Maret) 2015

DAFTAR ISI
KATA PENGANTAR.............................................................................................................2
===================================================================
MySQL Administration Fundamental
===================================================================
PENDAHULUAN..................................................................................................................4
Bab 1. Sekilas Tentang MySQL
Bab 2. Instalasi MySQL dan Software Pendukung
DASAR-DASAR MySQL....................................................................................................24
Bab 3. Merancang Database
Bab 4. Dasardasar SQL
Bab 5. Fungsifungsi MySQL
PERINTAH MySQL LANJUTAN........................................................................................62
Bab 6. Perintah MySQL Lanjutan
Bab 7. Administrasi dan Keamanan di MySQL
Bab 8. Trigger dan Views
Bab 9. Function dan Stored Procedure
LAPORAN DAN BACKUP DI MySQL ..............................................................................96
Bab 10. Laporan di MySQL
Bab 11. Backup, Restore dan Import di MySQL
===================================================================
MySQL Administration Advanced
===================================================================
MySQL METADATA.........................................................................................................107
Bab 12. Memanfaatkan MySQL Metadata
STORAGE ENGINE .......................................................................................................120
Bab 13. MySQL Storage Engine
MEMAKSIMALKAN KINERJA.........................................................................................132
Bab 14. Memaksimalkan Kinerja MySQL
MYSQL CLUSTER..........................................................................................................149
Bab 15. Installasi MySQL Cluster
-= SEKIAN =-...................................................................................................................162

Page 3

MySQL Database Administration

versi 1.0 (Maret) 2015

Bagian 1

PENDAHULUAN

Page 4

MySQL Database Administration

versi 1.0 (Maret) 2015

Bab 1
Sekilas Tentang MySQL

Pengenalan Database, DBMS, dan RDBMS

Beberapa Istilah Database

Hierarki Database

Pengenalan Database MySQL

Sejarah MySQL
Cerita tentang MySQL bermula pada tahun 1979, ketika Michael Widenius (a.k.a.
Monty), seorang programmer asal Swedia, mengembangkan sebuah sistem database
sederhana yang dinamakan UNIREG. UNIREG ini menggunakan koneksi low-level ISAM
database engine dengan indexing (baca : sistem database sederhana yang mendukung
index).
Monty bekerja pada perusahaan bernama TcX di Swedia. TcX pada tahun 1994
mulai mengembangkan aplikasi berbasis web, dan berencana menggunakan UNIREG
sebagai sistem databasenya. Namun malang bagi Monty, UNIREG dianggagap tidak
cocok untuk database yang dinamis seperti web.
TcX mencoba mencari alternatif sistem database lainnya, salah satunya adalah
mSQL (miniSQL), sebuah RDBMS yang tidak terlalu mahal dan hampir open source,
maksudnya jika anda membeli aplikasi ini, anda juga akan mendapatkan source code nya
juga. Namun mSQL versi 1 ini juga memiliki kekurangan, yaitu tidak mendukung indexing,
sehingga performanya tidak terlalu bagus.
Dengan hasutan petinggi-petinggi TcX, Monty mencoba menghubungi David
Hughes (programmer yang mengembangkan mSQL) untuk menanyakan apakah ia tertarik
mengembangkan sebuah konektor di mSQL yang dapat dihubungkan dengan UNIREG
ISAM sehingga mendukung indexing. Pada saat itu Hughes menolak, dengan alasan
sedang mengembangkan teknologi indexing yang independen untuk mSQL versi 2.
Dikarenakan penolakan David Hughes, TcX (dan juga Monty) akhirnya memutuskan
untuk merancang dan mengembangkan sendiri konsep sistem database baru. Sistem ini
merupakan gabungan dari UNIREG dan mSQL (source codenya dapat bebas digunakan).

Page 5

MySQL Database Administration

versi 1.0 (Maret) 2015

Sehingga pada May 1995, sebuah RDBMS baru, yang dinamakan MySQL dirilis.
David Axmark dari Detron HB, rekanan TcX mengusulkan agar MySQL di jual
dengan model bisnis baru. Ia mengusulkan agar MySQL dikembangkan dan dirilis dengan
gratis. Pendapatan perusahaan selanjutnya di dapat dari menjual jasa support untuk
perusahaan yang ingin mengimplementasikan MySQL. Konsep bisnis yang juga
diterapkan perusahaan-perusahaan Open Source lainnya.
Asal Nama MySQL
Asal penamaan MySQL sendiri agak unik. Monty berkata :
It is not perfectly clear where the name MySQL derives from. TcXs base directory
and a large amount of their libraries and tools have had the prefix My for well over ten
years. However, my daughter (some years younger) is also named My. So which of the
two gave its name to MySQL is still a mystery.
Berbagai sumber menyatakan, bahkan juga di situs MySQL sendiri bahwa My dari
MySQL berasal dari nama anak perempuan Monty. Namun seperti kutipan diatas, Monty
pun mengakui bahwa selama ia di TcX, library dan aplikasi yang dikembangkan
perusahaan itu juga banyak dimulai dengan awalan My.
Logo lumba-lumba dalam lambang MySQL di namai Sakila, yang berasal dari
sebuah kontest Name the Doplhin yang diadakan MySQL AB. Nama Sakila ini diajukan
oleh Ambrose Twebaze, seorang programmer open source dari Swaziland, Afrika. Sakila
memiliki akar dari bahasa Siswati, bahasa yang digunakan di Swaziland.
MySQL dan MySQL AB
Kembali ke kisah MySQL, Pada tahun 1995 itu juga, TcX berubah nama menjadi
MySQL AB, dengan Michael Widenius, David Axmark dan Allan Larsson sebagai
pendirinya. Titel AB dibelakang MySQL, adalah singkatan dari Aktiebolag, istilah PT
(Perseroan Terbatas) bagi perusahaan Swedia.
MySQL AB menjadi perusahaan di belakang MySQL, menyediakan jasa dan
bertanggung jawab dalam mengembangkan, memasarkan, dan menyediakan dukungan
untuk MySQL. MySQL sendiri dirilis dengan dual licencing, atau dua lisensi yakni versi
gratis dan versi berbayar.
Lisensi pertama di rilis dibawah GNU GPL (General Public License atau dikenal
juga dengan Gak Pakai Lisensi). Lisensi GPL ini membebaskan anda menggunakan
MySQL tanpa membayar loyalti kepada MySQL AB, dengan beberapa syarat tertentu.

Page 6

MySQL Database Administration

versi 1.0 (Maret) 2015

Misalnya, jika anda menggunakan MySQL dalam aplikasi yang anda buat, aplikasi
tersebut juga harus bersifat gratis dan berada di bawah lisensi GPL.
Lisensi kedua di peruntukkan bagi perusahaan-perusahaan komersil, maupun
pengembang software yang berniat menjual aplikasinya, dan menggunakan MySQL
sebagai databasenya. Untuk keperluan ini, anda diharuskan membeli lisensi komersial
dari MySQL AB. Lebih lanjut tentang permasalahan seputar lisensi MySQL, dapat
mengunjungi situs MySQL.
MySQL AB juga memegang hak copyright dari source code MySQL dan pemilik hak
merk dagang MySQL. Dengan kata lain, walaupun kita memiliki source code MySQL,
namun sistem database maupun aplikasi yang kita buat tidak boleh menggunakan merk
MySQL tanpa membayar loyalti kepada pihak MySQL AB. Hal ini pula yang menjelaskan
mengapa salah satu aplikasi administasi MySQL berbasis web PhpMyAdmin, tidak
menggunakan kata MySQL pada nama programnya.
MariaDB
MariaDB merupakan versi pengembangan terbuka dan mandiri dari MySQL. Sejak
diakuisisinya MySQL oleh Oracle pada September 2010, Monty Program sebagai penulis
awal kode sumber MySQL memisahkan diri dari pengembangan dan membuat versi yang
lebih mandiri yakni MariaDB.
Semua kemampuan MySQL dimiliki pula oleh MariaDB yakni:
1. Portabilitas. MariaDB dapat berjalan stabil pada berbagai sistem operasi seperti
Windows, Linux, FreeBSD, Mac Os X Server, Solaris, Amiga, dan masih banyak
lagi.
2. Perangkat lunak sumber terbuka. MariaDB didistribusikan sebagai perangkat lunak
sumber terbuka, dibawah lisensi GPL sehingga dapat digunakan secara gratis.
3. Multi-user. MariaDB dapat digunakan oleh beberapa pengguna dalam waktu yang
bersamaan tanpa mengalami masalah atau konflik.
4. 'Performance tuning', MariaDB memiliki kecepatan yang menakjubkan dalam
menangani query sederhana, dengan kata lain dapat memproses lebih banyak SQL
per satuan waktu.
5. Ragam tipe data. MariaDB memiliki ragam tipe data yang sangat kaya, seperti
signed / unsigned integer, float, double, char, text, date, timestamp, dan lain-lain.
6. Perintah dan Fungsi. MariaDB memiliki operator dan fungsi secara penuh yang
mendukung perintah Select dan Where dalam perintah (query).

Page 7

MySQL Database Administration

7. Keamanan.

MariaDB

versi 1.0 (Maret) 2015

memiliki

beberapa

lapisan

keamanan

seperti

level

subnetmask, nama host, dan izin akses user dengan sistem perizinan yang
mendetail serta sandi terenkripsi.
8. Skalabilitas dan Pembatasan. MariaDB mampu menangani basis data dalam skala
besar, dengan jumlah rekaman (records) lebih dari 50 juta dan 60 ribu tabel serta 5
miliar baris. Selain itu batas indeks yang dapat ditampung mencapai 32 indeks
pada tiap tabelnya.
9. Konektivitas. MariaDB dapat melakukan koneksi dengan klien menggunakan
protokol TCP/IP, Unix soket (UNIX), atau Named Pipes (NT).
10. Pelokalan Bahasa. MariaDB dapat mendeteksi pesan kesalahan pada klien dengan
menggunakan lebih dari dua puluh bahasa. Meski pun demikian, bahasa Indonesia
belum termasuk di dalamnya.
11. Antar Muka. MariaDB memiliki antar muka (interface) terhadap berbagai aplikasi
dan bahasa pemrograman dengan menggunakan fungsi API (Application
Programming Interface).
12. Klien dan Peralatan. MariaDB dilengkapi dengan berbagai peralatan (tool)yang
dapat digunakan untuk administrasi basis data, dan pada setiap peralatan yang ada
disertakan petunjuk online.
13. Struktur tabel. MariaDB memiliki struktur tabel yang lebih fleksibel dalam
menangani ALTER TABLE, dibandingkan basis data lainnya semacam PostgreSQL
ataupun Oracle.

Pengenalan Database, DBMS dan RDBMS


Basis data (atau database) adalah kumpulan informasi yang disimpan di dalam
komputer secara sistematik sehingga dapat diperiksa menggunakan suatu program
komputer

untuk

memperoleh

informasi

dari

basis

data

tersebut

(http://id.wikipedia.org/wiki/Database). Database digunakan untuk menyimpan informasi


atau data yang terintegrasi dengan baik di dalam komputer.
Untuk mengelola database diperlukan suatu perangkat lunak yang disebut DBMS
(Database Management System). DBMS merupakan suatu sistem perangkat lunak yang
memungkinkan

user (pengguna) untuk membuat, memelihara, mengontrol, dan

mengakses database secara praktis dan efisien. Dengan DBMS, user akan lebih mudah

Page 8

MySQL Database Administration

versi 1.0 (Maret) 2015

mengontrol dan memanipulasi data yang ada.


Sedangkan RDBMS atau Relationship Database Management System merupakan
salah satu jenis DBMS yang mendukung adanya relationship atau hubungan antar tabel.
Di samping RDBMS, terdapat jenis DBMS lain, misalnya Hierarchy DBMS, Object
Oriented DBMS, dsb.
Beberapa software atau perangkat lunak DBMS yang sering digunakan dalam
aplikasi program antara lain :
DB2

- http://www-306.ibm.com/software/data/db2/

Microsoft SQL Server

- http://www.microsoft.com/sql/

Oracle

- http://www.oracle.com

Sybase

- http://www.sybase.com/

Interbase

- http://www.borland.com/interbase

Teradata

- http://www.teradata.com/

Firebird

- http://www.firebirdsql.org/

MySQL

- http://www.mysql.com

PostgreSQL

- http://www.postgresql.org/

MySQL juga bukan satu-satunya RDBMS, list lengkapnya ada di wikipedia.


Diantaranya yang banyak dikenal adalah: Oracle, Sybase, Microsoft Access, Microsoft
SQL Server, dan PostgreSQL.
MySQL bersifat gratis dan open source. Artinya setiap orang boleh menggunakan
dan mengembangkan aplikasi ini. Namun walaupun gratis, MySQL di support oleh ribuan
programmer dari seluruh dunia, dan merupakan sebuah aplikasi RDBMS yang lengkap,
cepat, dan reliabel. Berikut beberapa keunggulan MySQL dibandingkan dengan RDBMS
lainnya:
Speed
Sebuah studi dari eWeek di February 2002 yang membandingkan performa
kecepatan MySQL dengan RDBMS lainnya, seperti Microsoft SQL Server 2000, IBM DB2,
Oracle 9i dan Sybase :
MySQL

has

the

best

overall

performance

and

that

MySQL

scalability matches Oracle MySQL had the highest throughput,


even exceeding the numbers generated by Oracle.
Yang terjemahan bebasnya, MySQL memiliki kecepatan yang lebih dibandingkan
pesaing yang berbayar. Bagi anda ingin membaca paper tersebut, tersedia di situs MySQL

Page 9

MySQL Database Administration

versi 1.0 (Maret) 2015

Reliability
Biasanya sesuatu yang gratis susah diandalkan, bahkan banyak bug dan sering
hang. Tidak demikian dengan MySQL, karena sifatnya yang open source, setiap orang
dapat berkontribusi memeriksa bug dan melakukan test case untuk berbagai skenario
yang memerlukan sistem 24 jam online, multi-user dan data ratusan GB. Hasilnya, MySQL
merupakan RDBMS yang reliabel namun memiliki performa diatas rata-rata.
Skalability
MySQL dapat memproses data yang sangat besar dan kompleks, tanpa ada
penurunan performa yang berarti, juga mendukung sistem multi-prosesor. MySQL juga
dipakai oleh perusahaan-perusahaan besar di dunia, seperti Epson, New York Times,
Wikipedia, Google, Facebook, bahkan NASA.
User Friendly
Instalasi dan mempelajari MySQL cukup mudah dan tidak dipusingkan dengan
banyak settingan. Cukup download aplikasi MySQL dan install, kita dapat menggunakan
MySQL dalam waktu kurang dari 5 menit (dengan asumsi tidak mati lampu).
Portability and Standard Compliance
Database MySQL dapat dengan mudah berpindah dari satu sistem ke sistem
lainnya. Misalkan dari sistem Windows ke Linux. Aplikasi MySQL juga dapat berjalan di
sistem Linux (RedHat, SuSE, Mandrake, Debian), Embedded Linux (MontaVista,
LynuxWorks BlueCat),Unix (Solaris, HP-UX, AIX), BSD (Mac OS X, FreeBSD), Windows
(Windows 2000, Windows NT) dan RTOS (QNX).
Multiuser Support
Dengan menerapkan arsitektur client-server. Ribuan pengguna dapat mengakses
database MySQL dalam waktu yang bersamaan.
Internationalization
Atau dalam bahasa sederhananya, mendukung beragam bahasa. Dengan
dukungan penuh terhadap unicode, maka aksara non-latin seperti jepang, cina, dan korea
bisa digunakan di dalam MySQL.

Page 10

MySQL Database Administration

versi 1.0 (Maret) 2015

Wide Application Support


Biasanya database RDBMS tidak digunakan sendirian, namun ditemani dengan
aplikasi atau bahasa pemograman lainnya untuk menyediakan interface, seperti C, C++,
C#, Java, Delphi, Visual Basic, Perl Python dan PHP. Kesemua itu di dukung oleh API
(Application Programming Interface) oleh MySQL.
Open Source Code
Kitapun bisa (jika mampu dan mengerti), mengembangkan MySQL dengan
mempelajari kode programmnya. MySQL di kembangkan dengan bahasa C and C++.
Bahkan sudah terdapat berbagai variasi rasa RDBMS baru yang dikembangkan dari code
MySQL, diantaranya: Drizzle, MariaDB, Percona Server dan OurDelta.

Beberapa Istilah Database


Table
Sebuah tabel merupakan kumpulan data (nilai) yang diorganisasikan ke dalam
baris (record) dan kolom (field). Masing-masing kolom memiliki nama yang spesifik dan
unik.
Field
Field merupakan kolom dari sebuah table. Field memiliki ukuran type data tertentu
yang menentukan bagaimana data nantinya tersimpan.
Record
Field merupakan sebuah kumpulan nilai yang saling terkait.
Key
Key merupakan suatu field yang dapat dijadikan kunci dalam operasi tabel. Dalam
konsep database, key memiliki banyak jenis diantaranya Primary Key, Foreign Key,
Composite Key, dll.
SQL

Page 11

MySQL Database Administration

versi 1.0 (Maret) 2015

SQL atau Structured Query Language merupakan suatu bahasa (language) yang
digunakan untuk mengakses database. SQL sering disebut juga sebagai query.

Hierarki Database

MySQL
MySQL adalah sebuah perangkat lunak sistem manajemen basis data SQL
(bahasa Inggris: database management system) atau DBMS yang multithread, multi-user,
dengan sekitar 6 juta instalasi di seluruh dunia. MySQL AB membuat MySQL tersedia
sebagai perangkat lunak gratis di bawah lisensi GNU General Public License (GPL), tetapi
mereka

juga

menjual

dibawah

lisensi

komersial

untuk

kasus-kasus

dimana

penggunaannya tidak cocok dengan penggunaan GPL.


Tidak seperti PHP atau Apache yang merupakan software yang dikembangkan oleh
komunitas umum, dan hak cipta untuk kode sumber dimiliki oleh penulisnya masingmasing, MySQL dimiliki dan disponsori oleh sebuah perusahaan komersial Swedia yaitu
MySQL AB. MySQL AB memegang penuh hak cipta hampir atas semua kode sumbernya.
Kedua orang Swedia dan satu orang Finlandia yang mendirikan MySQL AB adalah: David
Axmark, Allan Larsson, dan Michael "Monty" Widenius.

Page 12

MySQL Database Administration

versi 1.0 (Maret) 2015

MySQL dapat didownload di situs resminya, http://www.mysql.com.


Fitur-fitur MySQL antara lain :

Relational Database System. Seperti halnya software database lain yang ada di
pasaran, MySQL termasuk RDBMS.

Arsitektur Client-Server. MySQL memiliki arsitektur client-server dimana server


database MySQL terinstal di server. Client MySQL dapat berada di komputer yang
sama dengan server, dan dapat juga di komputer lain yang berkomunikasi dengan
server melalui jaringan bahkan internet.

Mengenal perintah SQL standar. SQL (Structured Query Language) merupakan


suatu bahasa standar yang berlaku di hampir semua software database. MySQL
mendukung SQL versi SQL:2003.

Mendukung Sub Select. Mulai versi 4.1 MySQL telah mendukung select dalam
select (sub select).

Mendukung Views. MySQL mendukung views sejak versi 5.0

Mendukung Stored Prosedured (SP). MySQL mendukung SP sejak versi 5.0

Mendukung Triggers. MySQL mendukung trigger pada versi 5.0 namun masih
terbatas. Pengembang MySQL berjanji akan meningkatkan kemampuan trigger
pada versi 5.1.

Mendukung replication.

Mendukung transaksi.

Mendukung foreign key.

Tersedia fungsi GIS.

Free (bebas didownload)

Stabil dan tangguh

Fleksibel dengan berbagai pemrograman

Security yang baik

Dukungan dari banyak komunitas

Perkembangan software yang cukup cepat.

Page 13

MySQL Database Administration

versi 1.0 (Maret) 2015

Bab 2
Instalasi MySQL dan Software Pendukung

Instalasi MySQL di Windows

Instalasi Software Pendukung MySQL

Instalasi MySQL di Windows


Persiapan
1. Download Source MySQL di http://www.mysql.com/downloads/ MySQL versi
terakhir saat materi ini dibuat adalah MySQL 5.7.45. Silahkan download versi
terakhir tersebut dan simpan di komputer. Pada dasarnya, instalasi untuk setiap
versi MySQL tidak jauh berbeda.
Proses Instalasi MySQL
1. Setelah mendapatkan source MySQL, selanjutnya perlu meng-ekstrak file tersebut
ke komputer.
2. Jalankan file mysql-installer-community-5.6.23.0.msi. Lihat gambar berikut ini !

3. Klik

Page 14

MySQL Database Administration

versi 1.0 (Maret) 2015

tombol Add untuk memilih component apa saja yang ingin di install

4. Pada contoh di bawah ini pilihan Component yang diinstall adalah MySQL Server
5.6.23 - x86

5. Di jendela selanjutnya akan dihadapkan dengan Pilihan dari Server Configuration,


pilih salah satu Config Type yang kita butuhkan

Page 15

MySQL Database Administration

versi 1.0 (Maret) 2015

Configuration Type dan Networking:

Development Machine: Digunakan untuk model server mysql yang bersifat


development.

Server Machine: Digunakan jika MySQL terinstall di server yang sudah


terdapat service lain semisal Apache dan Php, pada configuration type ini
MySQL akan berbagi memory dengan aplikasi lain.

Dedicatet Machine: Pada configuration type ini digunakan jika MySQL


terinstall di server yang didedikasikan hanya untuk MySQL (tidak ada
aplikasi server lain yang terinstall) sehingga pembakaian Resource seperti
memory dan CPU bisa lebih maksimal.

TCP/IP: Jika kita menceklis bagian ini maka MySQL akan membuka Port
dan LISTENING di server tersebut, sehingga MySQL dapat diakses melalui
remote komputer atau Applikasi yang berbeda server.

Port Number: Pada bagian port number kita dapat merubah port defaultnya
(3306) ke port yang diinginkan dengan catatan applikasi yang akan
mengakses dapat melakukan konfigurasi nomer port MySQL server.

6. Jendela berikutnya kita harus men-setting MySQL Root Password yang akan
digunakan untuk memanage MySQL server tersebut, kita juga bisa menambahkan
user lain pada bagian MySQL User Accounts.

Page 16

MySQL Database Administration

versi 1.0 (Maret) 2015

7. Proses penambahan user baru bisa dilihat dibagian bawah ini, pada bagian Role
kita bisa menentukan Akses Control apa saja yang diberikan ke user tersebut
berdasarkan template Roles yang sudah disediakan.

Page 17

MySQL Database Administration

versi 1.0 (Maret) 2015

8. Langkah terakhir adalah menapply konfigurasi yang sudah kita terapkan di jendela
installasi sebelumnya seperti gambar di bawah ini

Koneksi ke Server MySQL dengan MySQL Client


MySQL menyediakan tools untuk melakukan koneksi ke server MySQL, yaitu
MySQL Command-Line Client. Tools tersebut dapat diakses dari menu Start > All
Programs > MySQL > MySQL Server 5.6 > MySQL 5.6 Command Line Client.
Tampilannya kurang lebih tampak pada gambar berikut ini:
Untuk melakukan koneksi ke server MySQL, Cukup mengetikkan password koneksi
MySQL. Password ini didefinisikan pada saat proses instalasi. Jika passwordnya benar,
maka akan ditampilkan window sbb :

Page 18

MySQL Database Administration

versi 1.0 (Maret) 2015

Setelah koneksi ke server MySQL berhasil dilakukan, maka akan ditampilkan


prompt mysql> seperti pada gambar. Query atau perintah-perintah MySQL dapat dituliskan
pada prompt MySQL ini. Akhiri setiap query dengan titik-koma (;). Selanjutnya untuk keluar
dari server MySQL dapat dilakukan dengan mengetikkan perintah quit atau \q pada prompt
mysql>.

Tools MySQL Client untuk Administrasi Server MySQL


Berikut ini beberapa tools yang biasa digunakan dalam mempermudah administrasi
server MySQL. Tools berikut ini hanya digunakan untuk mempermudah administrasi
MySQL, jadi tidak harus digunakan.
1. MySQL Command Line Client
MySQL Command Line Client merupakan tools default MySQL yang sudah
disertakan dalam file instalasi MySQL. Aplikasi ini dapat digunakan untuk
melakukan koneksi ke MySQL melalui text-based mode

2. MySQL Front
Merupakan front-end MySQL berbasis Windows yang cukup banyak digunakan.
MySQL-Front memiliki user interface yang cukup mudah digunakan, bahkan oleh user
pemula. Pada awalnya MySQL-Front merupakan software yang free, namun mulai versi
3.0 ke atas, software ini menjadi software yang bersifat shareware dengan masa
percobaan selama 30 hari. Jika ingin mencoba software ini, cobalah MySQL-Front versi
2.5 karena selain masih bebas untuk didownload, versi 2.5 cukup stabil dan sudah teruji.

Page 19

MySQL Database Administration

versi 1.0 (Maret) 2015

Situs resmi MySQL-Front beralamat di http://www.mysqlfront.de

3. PHPMyAdmin
PHPMyAdmin merupakan front-end MySQL berbasis web. PHPMyAdmin dibuat
dengan menggunakan PHP. Saat ini, PHPMyAdmin banyak digunakan dalam hampir
semua penyedia hosting yang ada di internet. PHPMyAdmin mendukung berbagai fitu
administrasi MySQL termasuk manipulasi database, tabel, index dan juga dapat
mengeksport data ke dalam berbagai format data. PHPMyAdmin juga tersedia dalam 50
bahasa lebih, termasuk bahasa Indonesia. PHPMyAdmin dapat didownload secara gratis
di http://www.phpmyadmin.net

Page 20

MySQL Database Administration

versi 1.0 (Maret) 2015

Proses Installasi PHPMyAdmin

Page 21

MySQL Database Administration

versi 1.0 (Maret) 2015

4. Managemen Database dengan MySQL Workbench


Dengan tool ini kita dapat membuat rancangan ERD dan dapat langsung kita
generate menjadi format .sql.Selain membuat ERD dan relasinya,di sini kita juga dapat
menulis syntax sql.Syntax sql yang kita buat disini mempunyai syntax highlighter,jadinya
memudahkan kita untuk menulis syntax sql karena mempunyai warna yang berbeda untuk
setiap fungsinya.MySQL Workbench dapat didownload di sini:
http://www.mysql.com/downloads/workbench/#downloads
Monitor Perfomance MySQL dengan MySQL Workbench

Page 22

MySQL Database Administration

versi 1.0 (Maret) 2015

Koneksi ke Server MySQL dengan MySQL Client


MySQL menyediakan tools untuk melakukan koneksi ke server MySQL, yaitu
MySQL Command-Line Client. Tools tersebut dapat diakses dari menu Start > All
Programs > MySQL > MySQL Server 5> MySQL Command Line Client.

Page 23

MySQL Database Administration

versi 1.0 (Maret) 2015

Bagian 2

DASAR-DASAR MySQL

Page 24

MySQL Database Administration

versi 1.0 (Maret) 2015

Bab 3
Merancang Database

Tipe Table MySQL

Tipe Field MySQL

Merancang suatu database yang baik.

Merancang database merupakan hal yang pertama kali harus dilakukan sebelum
membuat suatu aplikasi berbasis database. Rancangan database yang baik akan
menentukan seberapa baik sebuah aplikasi dibangun. Orang yang bertanggung jawab
dalam merancang database biasanya disebut sebagai seorang sistem analis.
Berikut ini contoh sederhana sebuah rancangan database dalam pada Sistem
Pemesanan Barang (ordering system). Rancangan database disajikan dalam bentuk class
diagram.

Tipe-tipe Tabel MySQL


Salah satu kelebihan dari MySQL adalah dapat mendefinisikan tipe untuk tiap tabel.
MySQL mendukung beberapa tipe tabel, tergantung konfigurasi saat proses instalasi
MySQL. MySQL memiliki 3 (tiga) tipe data utama, yaitu MyISAM, InnoDB dan HEAP.
Jika kita tidak menyebutkan tipe tabel saat membuat tabel, maka tipe tabel otomatis
akan dibuat sesuai konfigurasi default server MySQL. Hal ini ditentukan oleh variabel
default-table-type di file konfigurasi MySQL.
MyISAM

Page 25

MySQL Database Administration

versi 1.0 (Maret) 2015

Tipe tabel MyISAM merupakan tipe tabel yang sederhana, stabil dan mudah
digunakan. Jika kita akan menyimpan data sederhana yang tidak terlalu rumit, maka
gunakanlah tipe tabel ini. Kelebihan utama MyISAM adalah kecepatan dan kestabilannya.
Jika kita memilih tipe tabel MyISAM, maka MySQL secara otomatis akan menentukan
salah satu dari tiga jenis tabel MyISAM, yaitu :
a) MyISAM static. Jenis ini digunakan ketika semua kolom dalam tabel didefinisikan
dengan ukuran yang pasti (fixed). Dengan kata lain, tidak ada kolom yang memiliki
tipe seperti VARCHAR, TEXT dan BLOB. Karena sifatnya yang fixed, maka jenis ini
akan lebih cepat, aman dan stabil.
b) MyISAM dymanic. Jenis ini digunakan ketika terdapat kolom dengan tipe yang
dinamis, seperti tipe kolom VARCHAR. Keuntungan utama dari jenis ini adalah
ukuran yang dinamis. Jadi sifatnya lebih efektif karena ukuran data (file)
menyesuaikan isi dari masing-masing kolom (field).
c) MyISAM Compressed. Kedua jenis MyISAM, static dan dynamic dapat dikompresi
menjadi satu jenis yaitu MyISAM Compressed dengan perintah myisamchk.
Tentunya hasilnya lebih kecil dari segi ukuran. Tabel yang terkompresi tidak dapat
dikenakan operasi seperti INSERT, UPDATE dan DELETE.
InnoDB
Tipe tabel InnoDB merupakan tipe tabel MySQL yang mendukung proses transaksi. Tipe
ini memiliki beberapa keunggulan, antara lain:
a) Mendukung transaksi antar tabel.
b) Mendukung row-level-locking.
c) Mendukung Foreign-Key Constraints dan Crash recovery.
HEAP
Tabel dengan tipe HEAP tidak menyimpan datanya di hardisk, tetapi menyimpan di RAM
(memori). Tipe tabel ini biasanya digunakan sebagai tabel sementara (temporary). Tabel
secara otomatis akan dihapus (hilang) dari MySQL saat koneksi ke server diputus atau
server MySQL dimatikan.
Tipe Tabel yang Lain
Selain 3 (tiga) tipe tabel diatas, yaitu MyISAM, InnoDB dan HEAP, MySQL juga
mendukung tipe tabel yang lain, yaitu:
a) BDB. Tipe tabel ini mirip tipe tabel InnoDB, namun penggunaannya belum
maksimal.

Page 26

MySQL Database Administration

versi 1.0 (Maret) 2015

b) Archieve. Tipe ini tersedia sejak MySQL versi 4.1. Tipe ini digunakan untuk
menyimpan tabel yang terkompresi, dimana biasanya digunakan dalam proses
backup.
c) CSV. Tipe ini digunakan untuk menyimpan data dalam bentuk file text yang dibatasi
dengan koma (delimiter). Tipe ini tersedia sejak MySQL versi 4.1.
d) NDB Table (MySQL Cluster). Tersedia sejak MySQL versi 4.1.
e) Federated (External Tables). Tipe ini tersedia sejak MySQL versi 5.0.

Tipe-tipe Field (Kolom) MySQL


MySQL memiliki cukup banyak tipe data untuk field (kolom) tabel. Tipe field (kolom)
ini menentukan besar kecilnya ukuran suatu tabel. Tipe field di MySQL setidaknya terbagi
menjadi beberapa kelompok, yaitu numerik, string, date-and- time, dan kelompok
himpunan (set dan enum). Masing-masing tipe field memiliki batasan lebar dan ukurannya.

Tipe Numeric
Tipe data numerik digunakan untuk menyimpan data numeric (angka). Ciri utama
data numeric adalah suatu data yang memungkinkan untuk dikenai operasi aritmatika
seperti pertambahan, pengurangan, perkalian dan pembagian. Berikut ini tipe field (kolom)
di MySQL yang termasuk ke dalam kelompok tipe numerik:
TINYINT
Penggunaan : digunakan untuk menyimpan data bilangan bulat positif dan negatif.
Jangkauan

: -128 s/d 127

Ukuran

: 1 byte (8 bit).

Page 27

MySQL Database Administration

versi 1.0 (Maret) 2015

SMALLINT
Penggunaan : digunakan untuk menyimpan data bilangan bulat positif dan negatif.
Jangkauan

: -32.768 s/d 32.767

Ukuran

: 2 byte (16 bit).

MEDIUMINT
Penggunaan : digunakan untuk menyimpan data bilangan bulat positif dan negatif.
Jangkauan

: -8.388.608 s/d 8.388.607

Ukuran

: 3 byte (24 bit).

INT
Penggunaan : digunakan untuk menyimpan data bilangan bulat positif dan negatif.
Jangkauan

: -2.147.483.648 s/d 2.147.483.647

Ukuran

: 4 byte (32 bit).

BIGINT
Penggunaan : digunakan untuk menyimpan data bilangan bulat positif dan negatif.
Jangkauan

: 9,22 x 1018

Ukuran

: 8 byte (64 bit).

FLOAT
Penggunaan : digunakan untuk menyimpan data bilangan pecahan positif dan
negatif presisi tunggal.
Jangkauan

: -3.402823466E+38 s/d -1.175494351E-38, 0, dan 1.175494351E-38


s/d 3.402823466E+38.

Ukuran

: 4 byte (32 bit).

DOUBLE
Penggunaan : digunakan untuk menyimpan data bilangan pecahan positif dan
negatif presisi ganda.
Jangkauan

: -1.79...E+308 s/d -2.22...E-308, 0, dan 2.22...E-308 s/d


1.79...E+308.

Ukuran

: 8 byte (64 bit).

Page 28

MySQL Database Administration

versi 1.0 (Maret) 2015

REAL
Merupakan sinonim dari DOUBLE.
DECIMAL
Penggunaan : digunakan untuk menyimpan data bilangan pecahan positif dan
negatif.
Jangkauan

: -1.79...E+308 s/d -2.22...E-308, 0, dan 2.22...E-308 s/d


1.79...E+308.

Ukuran

: 8 byte (64 bit).

NUMERIC
Merupakan sinonim dari DECIMAL.

Tipe Date dan Time


Tipe data date dan time digunakan untuk menyimpan data tanggal dan waktu. Berikut ini
tipe field (kolom) di MySQL yang termasuk ke dalam kelompok tipe date dan time:
DATE
Penggunaan : digunakan untuk menyimpan data tanggal.
Jangkauan

: 1000-01-01 s/d 9999-12-31 (YYYY-MM-DD)

Ukuran

: 3 byte.

TIME
Penggunaan : digunakan untuk menyimpan data waktu.
Jangkauan

: -838:59:59 s/d +838:59:59 (HH:MM:SS)

Ukuran

: 3 byte.

DATETIME
Penggunaan : digunakan untuk menyimpan data tanggal dan waktu.
Jangkauan

: '1000-01-01 00:00:00' s/d '9999-12-31 23:59:59'

Ukuran

: 8 byte.

YEAR

Page 29

MySQL Database Administration

versi 1.0 (Maret) 2015

Penggunaan : digunakan untuk menyimpan data tahun dari tanggal.


Jangkauan

: 1900 s/d 2155

Ukuran

: 1 byte.

Tipe String (Text)


Tipe data string digunakan untuk menyimpan data string (text). Ciri utama data string
adalah suatu data yang memungkinkan untuk dikenai operasi aritmatika seperti
pertambahan, pengurangan, perkalian dan pembagian. Berikut ini tipe field (kolom) di
MySQL yang termasuk ke dalam kelompok tipe string:
CHAR
Penggunaan : digunakan untuk menyimpan data string ukuran tetap.
Jangkauan

: 0 s/d 255 karakter

VARCHAR
Penggunaan : digunakan untuk menyimpan data string ukuran dinamis.
Jangkauan

: 0 s/d 255 karakter (versi 4.1), 0 s/d 65.535 (versi 5.0.3)

TINYTEXT
Penggunaan : digunakan untuk menyimpan data text.
Jangkauan

: 0 s/d 255 karakter (versi 4.1), 0 s/d 65.535 (versi 5.0.3)

TEXT
Penggunaan : digunakan untuk menyimpan data text.
Jangkauan

: 0 s/d 65.535 (216 - 1) karakter

MEDIUMTEXT
Penggunaan : digunakan untuk menyimpan data text.
Jangkauan

: 0 s/d 224 - 1 karakter

LONGTEXT
Penggunaan : digunakan untuk menyimpan data text.
Jangkauan

: 0 s/d 232 - 1 karakter

Page 30

MySQL Database Administration

versi 1.0 (Maret) 2015

Tipe BLOB (Biner)


ipe data blob digunakan untuk menyimpan data biner. Tipe ini biasanya digunakan untuk
menyimpan kode-kode biner dari suatu file atau object. BLOB merupakan singkatan dari
Binary Large Object. Berikut ini tipe field (kolom) di MySQL yang termasuk ke dalam
kelompok tipe blob:
BIT (sejak versi 5.0.3)
Penggunaan : digunakan untuk menyimpan data biner.
Jangkauan

: 64 digit biner

TINYBLOB
Penggunaan : digunakan untuk menyimpan data biner.
Jangkauan

: 255 byte

BLOB
Penggunaan : digunakan untuk menyimpan data biner.
Jangkauan

: 216 - 1 byte

MEDIUMBLOB
Penggunaan : digunakan untuk menyimpan data biner.
Jangkauan

: 224 - 1 byte

LONGBLOB
Penggunaan : digunakan untuk menyimpan data biner.
Jangkauan

: 232 - 1 byte

Tipe Data yang Lain


Selain tipe data di atas, MySQL juga menyediakan tipe data yang lain. Tipe data di MySQL
mungkin akan terus bertambah seiring dengan perkembangan versi MySQL. Berikut ini
beberapa tipe data tambahan MySQL:
ENUM
Penggunaan : enumerasi (kumpulan data).
Jangkauan

: sampai dengan 65535 string.

Page 31

MySQL Database Administration

versi 1.0 (Maret) 2015

SET
Penggunaan : combination (himpunan data).
Jangkauan

: sampai dengan 255 string anggotas.

Merancang Database yang Baik


Seperti telah disebutkan sebelumnya, bahwa rancangan database menentuk suatu
aplikasi efektif atau tidak, efisien atau tidak, baik atau tidak. Pembahasan mengenai
bagaimana merancang database yang baik tentunya sangat panjang. Kita dapat mencari
referensi terkait dengan perancangan database .

Beberapa Aturan Merancang Database yang Baik.


a) Tabel dalam database tidak boleh mengandung record (data) ganda, atau dengan
kata lain tidak boleh ada redudancy data. Jika terdapat data yang sama, maka perlu
dilihat kembali rancangan tabelnya.
b) Setiap tabel dalam database, harus memiliki field (kolom) yang unik. Field ini
disebut sebagai Primary Key.
c) Tabel harus sudah normal.
d) Besar atau ukuran database hendaknya dibuat seminimal mungkin. Hal ini
ditentukan oleh pemilihan tipe data yang tepat.
e) Merancang database hendaknya memperhatikan apakah rancangan dapat
menampung data (record) sesuai yang dibutuhkan oleh aplikasi.

Tips Penamaan Identifier.


a) Penamaan identifier (database, tabel, kolom) di MySQL bersifat case- sensitive.
Penamaan identifier hendaknya konsisten untuk semua tabel dalam suatu
database. Kita dapat menggunakan model lower-case, UPPER-CASE, camelCase
dll.
b) Nama database, tabel dan kolom maksimal 64 karakter.
c) Hindari penggunaan karakter khusus, seperti , karena bisa bermasalah dalam
sistem operasi yang lain.
d) Pilih nama untuk field (kolom) yang mencerminkan isi dari data yang disimpan.

Page 32

MySQL Database Administration

versi 1.0 (Maret) 2015

Bab 4
Dasar-dasar SQL

Pendahuluan

Perintah DDL

Perintah DML

Pendahuluan
SQL merupakan singkatan dari Structured Query Language. SQL atau juga sering
disebut sebagai query merupakan suatu bahasa (language) yang digunakan untuk
mengakses database. SQL dikenalkan pertama kali dalam IBM pada tahun 1970 dan
sebuah standar ISO dan ANSII ditetapkan untuk SQL. Standar ini tidak tergantung pada
mesin yang digunakan (IBM, Microsoft atau Oracle). Hampir semua software database
mengenal atau mengerti SQL. Jadi, perintah SQL pada semua software database hampir
sama.
Terdapat 3 (tiga) jenis perintah SQL, yaitu :
1. DDL atau Data Definition Language
DDL merupakan perintah SQL yang berhubungan dengan pendefinisian suatu
struktur database, dalam hal ini database dan table. Beberapa perintah dasar yang
termasuk DDL ini antara lain :

CREATE

ALTER

RENAME

DROP

2. DML atau Data Manipulation Language


DML merupakan perintah SQL yang berhubungan dengan manipulasi atau
pengolahan data atau record dalam table. Perintah SQL yang termasuk dalam DML
antara lain :

SELECT

INSERT

UPDATE

Page 33

MySQL Database Administration

versi 1.0 (Maret) 2015

DELETE

3. DCL atau Data Control Language


DCL merupakan perintah SQL yang berhubungan dengan manipulasi user dan hak
akses (priviledges). Perintah SQL yang termasuk dalam DCL antara lain :

GRANT

REVOKE

Membuat, Menampilkan, Membuka dan Menghapus Database


Membuat Database
Sintaks umum SQL untuk membuat suatu database adalah sebagai berikut :
CREATE DATABASE [IF NOT EXISTS] nama_database;
Bentuk perintah di atas akan membuat sebuah database baru dengan nama
nama_database. Aturan penamaan sebuah database sama seperti aturan penamaan
sebuah variabel, dimana secara umum nama database boleh terdiri dari huruf, angka dan
under-score (_). Jika database yang akan dibuat sudah ada, maka akan muncul pesan
error. Namun jika ingin otomatis menghapus database yang lama jika sudah ada, aktifkan
option IF NOT EXISTS.
Berikut ini contoh perintah untuk membuat database baru dengan nama
penjualan :
CREATE DATABASE penjualan;

Jika query di atas berhasil dieksekusi dan database berhasil dibuat, maka akan
ditampilkan pesan kurang lebih sebagai berikut :
Query OK, 1 row affected (0.02 sec)

Menampilkan Database
Untuk melihat database yang baru saja dibuat atau yang sudah ada, dapat
menggunakan perintah sebagai berikut :
SHOW DATABASES;

Hasil dari perintah di atas akan menampilkan semua database yang sudah ada di

Page 34

MySQL Database Administration

versi 1.0 (Maret) 2015

MySQL. Berikut ini contoh hasil dari query di atas :


+--------------+
| Database
| --------------+
| penjualan
| mysql
| test
| --------------+
3 rows in set (0.02 sec)

Membuka Database
Sebelum melakukan manipulasi tabel dan record yang berada di dalamnya, kita
harus membuka atau mengaktifkan databasenya terlebih dahulu. Untuk membuka
database penjualan, berikut ini querynya :
USE penjualan;

Jika perintah atau query di atas berhasil, maka akan ditampilkan pesan sebagai berikut :
Database changed

Menghapus Database
Untuk menghapus suatu database, sintaks umumnya adalah sbb :
DROP DATABASE [IF EXISTS] nama_database;

Bentuk

perintah

di

atas

akan

menghapus

database

dengan

nama

nama_database. Jika databasenya ada maka database dan juga seluruh tabel di
dalamnya akan dihapus. Jadi berhati-hatilah dengan perintah ini! Jika nama database
yang akan dihapus tidak ditemukan, maka akan ditampilkan pesan error. Aktifkan option
IF EXISTS untuk memastikan bahwa suatu database benar-benar ada.
Berikut ini contoh perintah untuk menghapus database dengan nama penjualan :
DROP DATABASE penjualan;

Membuat, Menampilkan, Membuka dan Menghapus Database


Membuat Tabel Baru
Bentuk umum SQL untuk membuat suatu table secara sederhana sebagai berikut :

Page 35

MySQL Database Administration

versi 1.0 (Maret) 2015

CREATE TABLE nama_tabel (


field1 tipe(panjang),
field2 tipe(panjang),
...
fieldn tipe(panjang),
PRIMARY KEY (field_key)
);

Bentuk umum di atas merupakan bentuk umum pembuatan tabel yang sudah
disederhanakan. Penamaan tabel dan field memiliki aturan yang sama dengan penamaan
database.
Sebagai contoh, kita akan membuat tabel baru dengan struktur sebagai berikut :
Nama tabel : pelanggan
No

Nama Field

Tipe

Panjang

id_pelanggan *

Varchar

nm_pelanggan

Varchar

30

alamat

Text

telepon

Varchar

20

email

Varchar

50T

Untuk membuat tabel tersebut di atas, query atau perintah SQL-nya adalah sebagai
berikut :
CREATE TABLE pelanggan (
id_pelanggan varchar(5) NOT NULL,
nm_pelanggan varchar(30) NOT NULL,
alamat text,
telepon varchar (20),
email varchar (50),
PRIMARY KEY(id_pelanggan)
);

Jika query untuk membuat tabel di atas berhasil dijalankan, maka akan ditampilkan pesan
sebagai berikut :
Query OK, 0 rows affected (0.16 sec)

Pada perintah di atas, beberapa hal yang perlu diperhatikan :

CREATE TABLE merupakan perintah dasar dari pembuatan table.

pelanggan merupakan nama tabel yang akan dibuat.

id_pelanggan, nm_pelanggan, alamat, telepon dan email merupakan


nama field.

varchar dan text merupakan tipe data dari field

NOT NULL merupakan option untuk menyatakan bahwa suatu field tidak boleh

Page 36

MySQL Database Administration

versi 1.0 (Maret) 2015

kosong.

PRIMARY KEY merupakan perintah untuk menentukan field mana yang akan
dijadikan primary key pada tabel.

5, 10, 30 dan 50 di belakang tipe data merupakan panjang maksimal dari suatu
field.

Untuk tipe data date dan text (juga date dan blob) panjang karakter maksimalnya
tidak perlu ditentukan.

Jangan lupa akhiri perintah dengan titik-koma (;)

Selanjutnya untuk melihat tabel pelanggan sudah benar-benar sudah ada atau belum,
ketikkan perintah berikut ini :
SHOW TABLES;

Perintah di atas akan menampilkan seluruh tabel yang sudah ada dalam suatu database.
Contoh hasil dari perintah di atas adalah sebagai berikut :
+---------------------+
| Tables_in_penjualan |
+---------------------+
| pelanggan
|
+---------------------+
1 row in set (0.00 sec)

Untuk melihat struktur tabel pelanggan secara lebih detail, cobalah perintah atau query
sebagai berikut :
DESC pelanggan;

DESC merupakan singkatan dari DESCRIBE (dalam query bisa ditulis lengkap atau hanya
4 karakter pertama) dan pelanggan adalah nama tabel yang akan dilihat strukturnya. Dari
perintah di atas, akan ditampilkan struktur tabel pelanggan sebagai berikut :
+--------------+-------------+------+-----+---------+-------+
| Field
| Type
| Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| id_pelanggan | varchar(5) | NO
| PRI | NULL
|
|
| nm_pelanggan | varchar(30) | NO
|
| NULL
|
|
| alamat
| text
| YES |
| NULL
|
|
| telepon
| varchar(20) | YES |
| NULL
|
|
| email
| varchar(50) | YES |
| NULL
|
|
+--------------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

Dari struktur tabel pelanggan yang ditampilkan di atas, dapat diketahui bahwa :

Terdapat 5 (lima) field dengan tipe masing-masing.

Page 37

MySQL Database Administration

versi 1.0 (Maret) 2015

Primary Key dari tabel pelanggan adalah id_pelanggan. Lihat kolom Key pada
field id_pelanggan.

Untuk field id_pelanggan dan nm_pelanggan defaultnya tidak boleh kosong.


Lihatlah kolom Null dan Default pada field id_pelanggan dan nm_pelanggan.

Untuk field alamat, telepon dan email default-nya boleh kosong. Lihatlah kolom
Null dan Default pada field alamat dan telepon.

Mengubah Struktur Table dengan ALTER


Untuk mengubah struktur suatu tabel, bentuk umum perintah SQL-nya sebagai
berikut :
ALTER TABLE nama_tabel alter_options;

dimana :

ALTER TABLE merupakan perintah dasar untuk mengubah tabel.


nama_tabel merupakan nama tabel yang akan diubah strukturnya.
alter_options merupakan pilihan perubahan tabel. Option yang bisa digunakan,
beberapa di antaranya sebagai berikut :
ADD definisi_field_baru
Option

ini

digunakan

untuk

menambahkan

field

baru

dengan

definisi_field_baru (nama field, tipe dan option lain).


ADD INDEX nama_index
Option ini digunakan untuk menambahkan index dengan nama nama_index
pada tabel.
ADD PRIMARY KEY (field_kunci)
Option untuk menambahkan primary key pada tabel
CHANGE field_yang_diubah definisi_field_baru
Option untuk mengubah field_yang_diubah menjadi definisi_field_baru
MODIFY definisi_field
Option untuk mengubah suatu field menjadi definisi_field
DROP nama_field
Option untuk menghapus field nama_field
RENAME TO nama_tabel_baru
Option untuk mengganti nama tabel

Page 38

MySQL Database Administration

versi 1.0 (Maret) 2015

Beberapa contoh variasi perintah ALTER untuk mengubah struktur suatu tabel
antara lain :
1. Menambahkan field tgllahir ke tabel pelanggan
ALTER TABLE pelanggan ADD tgllahir date NOT NULL;

2. Menambahkan primary key pada suatu tabel


ALTER TABLE pelanggan ADD PRIMARY KEY(id_pelanggan);

3. Mengubah tipe field tgllahir menjadi varchar dalam tabel pelanggan


ALTER TABLE pelanggan MODIFY tgllahir varchar(8) NOT NULL;

4. Menghapus field tgllahir dari tabel pelanggan


ALTER TABLE pelanggan DROP tgllahir;

Mengubah Nama Tabel


Untuk mengubah nama suatu tabel, dapat menggunakan perintah SQL sbb :
RENAME TABLE pelanggan TO plg;
ALTER TABLE plg RENAME TO pelanggan;
Perintah di atas akan mengubah tabel pelanggan menjadi plg dan sebaliknya.

Menghapus Tabel
Untuk menghapus sebuah tabel, bentuk umum dari perintah SQL adalah sebagai berikut :
DROP TABLE nama_tabel;

Contohnya kita akan menghapus tabel dengan nama pelanggan maka perintah SQL-nya
adalah :
DROP TABLE pelanggan;

Page 39

MySQL Database Administration

versi 1.0 (Maret) 2015

Menambah Record dengan INSERT


Bentuk umum perintah SQL untuk menambahkan record atau data ke dalam

suatu tabel adalah sebagai berikut :


INSERT INTO nama_tabel VALUES (nilai1,nilai2,...);

atau dapat dengan bentuk sebagai berikut :


INSERT INTO nama_tabel(field1,field2,...)
VALUES (nilai1,nilai2,...);

atau dapat juga dengan bentuk sebagai berikut :


INSERT INTO nama_tabel
SET field1=nilai1, field2=nilai2,...;

Sebagai contoh, kita akan menambahkan sebuah record ke dalam tabel pelanggan yang
telah kita buat sebelumnya. Berikut ini perintah SQL untuk menambahkan sebuah record
ke dalam tabel pelanggan :
INSERT INTO pelanggan VALUES ('P0001', 'Yusuf Hadiwinata','Jakarta Selatan',
'085692019009',
'yusuf.hadiwinata@gmail.com')

Jika perintah SQL di atas berhasil dieksekusi maka akan ditampilkan pesan sebagai
berikut :
Query OK, 1 row affected (0.00 sec)

Setelah perintah SQL di atas berhasil dieksekusi, maka record atau data dalam tabel
pelanggan akan bertambah. Jalankan perintah berikut ini untuk melihat isi tabel pelanggan
SELECT * FROM pelanggan;

Dan berikut ini hasil dari perintah SQL di atas :


+--------------+------------------+----------------+--------------+----------------------------+
| id_pelanggan | nm_pelanggan
| alamat
| telepon
| email
|
+--------------+------------------+----------------+--------------+----------------------------+
| P0001
| Yusuf Hadiwinata | Jakarta Selatan |085692019009 | yusuf.hadiwinata@gmail.com |
+--------------+------------------+-----------------+--------------+----------------------------+
1 row in set (0.08 sec)

Page 40

MySQL Database Administration

versi 1.0 (Maret) 2015

Merubah Record dengan INSERT


Proses update bisa sewaktu-waktu dilakukan jika terdapat data atau record dalam
suatu tabel yang perlu diperbaiki. Proses update ini tidak menambahkan data (record)
baru, tetapi memperbaiki data yang lama. Perubahan yang terjadi dalam proses update
bersifat permanen, artinya setelah perintah dijalankan tidak dapat di-cancel (undo).
Bentuk umum perintah SQL untuk mengedit suatu record atau data dari suatu tabel
adalah sebagai berikut :
UPDATE nama_tabel SET field1=nilaibaru
[WHERE kondisi];

Pada perintah untuk update di atas :

UPDATE merupakan perintah dasar untuk mengubah record tabel.

nama_tabel merupakan nama tabel yang akan diubah recordnya.

Perintah SET diikuti dengan field-field yang akan diubah yang mana diikuti juga
dengan perubahan isi dari masing-masing field. Untuk mengubah nilai dari
beberapa field sekaligus, gunakan koma (,) untuk memisahkan masing- masing
field.

Perintah WHERE diikuti oleh kondisi tertentu yang menentukan record mana yang
akan diedit (diubah). Perintah WHERE ini boleh ada boleh juga tidak. Jika WHERE
tidak ditambahkan pada perintah update maka semua record dalam tabel
bersangkutan akan berubah.
Perhatikan beberapa contoh perintah UPDATE tabel pelanggan berikut ini !

1. Mengubah alamat menjadi Bekasi untuk pelanggan yang mempunyai id P0001


UPDATE pelanggan SET alamat='Bekasi' WHERE
id_pelanggan='P0001';

Dan jika query di atas berhasil dieksekusi maka akan ditampilkan hasil sebagai
berikut :
Query OK, 1 row affected (0.27 sec)
Rows matched: 1 Changed: 1 Warnings: 0

2. Mengubah email menjadi budi@luhur.com dan alamat menjadi Bandung untuk


pelanggan yang mempunyai id_pelanggan P0002
UPDATE pelanggan SET email='budi@luhur.com',

Page 41

MySQL Database Administration

versi 1.0 (Maret) 2015

alamat='Bandung' WHERE id_pelanggan='P0002';

Menghapus Record dengan DELETE


Proses delete dilakukan jika terdapat data atau record dalam suatu tabel yang perlu
dihapus atau dihilangkan. Perubahan yang terjadi dalam proses delete bersifat permanen,
artinya setelah perintah dijalankan tidak dapat di-cancel (undo). Jadi berhati-hatilah
dengan perintah delete !
Bentuk umum perintah SQL untuk menghapus suatu record atau data dari tabel
adalah sebagai berikut :
DELETE FROM nama_tabel [WHERE kondisi];

Pada perintah untuk delete di atas :

DELETE FROM merupakan perintah dasar untuk menghapus suatu record dari
tabel.

nama_tabel merupakan nama tabel yang akan dihapus recordnya.

Perintah WHERE diikuti oleh kondisi tertentu yang menentukan record mana yang
akan dihapus (didelete). Perintah WHERE ini boleh ada boleh juga tidak. Namun
demikian, jika WHERE tidak ditambahkan pada perintah delete maka semua record
dalam tabel bersangkutan akan terhapus. Jadi jangan lupa menambahkan WHERE
jika kita tidak bermaksud mengosongkan tabel

Perhatikan beberapa contoh perintah DELETE dari tabel pelanggan berikut ini !
1. Menghapus data pelanggan yang mempunyai id_pelanggan P0002
DELETE FROM pelanggan WHERE id_pelanggan='P0002';

Dan jika query di atas berhasil dieksekusi dan record yang akan dihapus ada, maka
akan ditampilkan hasil sebagai berikut :
Query OK, 1 row affected (0.11 sec)

2. Menghapus semua pelanggan yang beralamat di Bandung


DELETE FROM pelanggan WHERE alamat='Bandung';

Menampilkan Record dengan SELECT


Page 42

MySQL Database Administration

versi 1.0 (Maret) 2015

Perintah SELECT digunakan untuk menampilkan sesuatu. Sesuatu di sini bisa


berupa sejumlah data dari tabel dan bisa juga berupa suatu ekspresi. Dengan SELECT kita
bisa mengatur tampilan atau keluaran sesuai tampilan yang diinginkan.
Bentuk dasar perintah SELECT data dari tabel adalah sebagai berikut :
SELECT [field | *] FROM nama_tabel [WHERE kondisi];

Perhatikan beberapa contoh perintah SELECT dari tabel pelanggan berikut ini !
1. Menampilkan seluruh data atau record (*) dari tabel pelanggan
SELECT * FROM pelanggan;

Dan jika query di atas berhasil dieksekusi maka akan ditampilkan hasil sebagai
berikut :
+--------------+------------------+---------------+--------------+----------------------------+
| id_pelanggan | nm_pelanggan
| alamat
| telepon
| email
|
+--------------+------------------+---------------+--------------+----------------------------+
| P0001
| Yusuf Hadiwinata | Bekasi
| 085692019009 | yusuf.hadiwinata@gmail.com |
| P0002
| Yoga Rimaldo
| Bandung
| 08571239501 | yoga@computradetech.com
|
| P0003
| Winny
| Jakarta Barat | 0815829221
| winny@computradetech.com
|
| P0004
| Ninda Budianto
| Jakarta Timur | 08171231234 | ninda@computradetech.com
|
+--------------+------------------+---------------+--------------+----------------------------+
4 rows in set (0.00 sec)

2. Menampilkan field id_pelanggan dan nm_pelanggan dari seluruh pelanggan


dalam tabel pelanggan
SELECT id_pelanggan, nm_pelanggan FROM pelanggan;

Jika query di atas berhasil dieksekusi maka akan ditampilkan hasil sebagai berikut :
+--------------+------------------+
| id_pelanggan | nm_pelanggan
|
+--------------+------------------+
| P0001
| Yusuf Hadiwinata |
| P0002
| Yoga Rimaldo
|
| P0003
| Winny
|
| P0004
| Ninda Budianto
|
+--------------+------------------+
4 rows in set (0.00 sec)

3. Menampilkan id, nama dan alamat dari data pelanggan yang mempunyai id P0004
SELECT id_pelanggan, nm_pelanggan, alamat
FROM pelanggan WHERE id_pelanggan = 'P0004';

Hasil query di atas adalah sbb :

Page 43

MySQL Database Administration

versi 1.0 (Maret) 2015

+--------------+----------------+---------------+
| id_pelanggan | nm_pelanggan
| alamat
|
+--------------+----------------+---------------+
| P0004
| Ninda Budianto | Jakarta Timur |
+--------------+----------------+---------------+
1 row in set (0.00 sec)

4. Menampilkan id, nama dan email data semua pelanggan yang mempunyai email di
gmail
SELECT id_pelanggan, nm_pelanggan, email
FROM pelanggan WHERE email LIKE '%gmail%';

Hasil query di atas adalah sbb :


+--------------+------------------+----------------------------+
| id_pelanggan | nm_pelanggan
| email
|
+--------------+------------------+----------------------------+
| P0001
| Yusuf Hadiwinata | yusuf.hadiwinata@gmail.com |
+--------------+------------------+----------------------------+
1 row in set (0.02 sec)

Berikut ini operator perbandingan yang dapat digunakan untuk membandingkan


dua buah nilai dalam MySQL :

Operator =, akan bernilai TRUE jika nilai yang dibandingkan sama.

Operator != atau <>, akan bernilai TRUE jika nilai yang dibandingkan TIDAK SAMA
(berbeda).

Operator >, akan bernilai TRUE jika nilai yang pertama lebih besar dari nilai kedua.

Operator >=, akan bernilai TRUE jika nilai yang pertama lebih besar atau sama
dengan nilai kedua.

Operator <, akan bernilai TRUE jika nilai yang pertama lebih kecil dari nilai kedua.

Operator <=, akan bernilai TRUE jika nilai yang pertama lebih kecil atau sama
dengan nilai kedua.

5. Menampilkan data semua pelanggan yang beralamat di Jakarta Timur dan


mempunyai email di gmail.
SELECT id_pelanggan, nm_pelanggan, alamat, email
FROM pelanggan WHERE alamat = 'Jakarta Timur' &&
email LIKE '%gmail.com';

Hasil query di atas adalah sbb :


+--------------+--------------+---------------+---------------+
| id_pelanggan | nm_pelanggan | alamat
| email
|

Page 44

MySQL Database Administration

versi 1.0 (Maret) 2015

+--------------+--------------+---------------+---------------+
| P0005
| Rea
| Jakarta Timur | rea@gmail.com |
+--------------+--------------+---------------+---------------+
1 row in set (0.00 sec)

Berikut ini operator penghubung yang dapat digunakan untuk menghubungkan


antara dua kondisi dalam MySQL :

Operator && atau AND, akan menghubungkan dua kondisi dimana akan
bernilai TRUE jika kedua kondisi bernilai TRUE.

Operator || atau OR, akan menghubungkan dua kondisi dimana akan


bernilai TRUE jika salah satu atau kedua kondisi bernilai TRUE.

Operator !, akan me-reverse nilai suatu kondisi logika.

6. Menampilkan semua data pelanggan secara urut berdasarkan nama pelanggan


dengan perintah ORDER BY
+--------------+------------------+
| id_pelanggan | nm_pelanggan
|
+--------------+------------------+
| P0004
| Ninda Budianto
|
| P0005
| Rea
|
| P0003
| Winny
|
| P0002
| Yoga Rimaldo
|
| P0001
| Yusuf Hadiwinata |
+--------------+------------------+
5 rows in set (0.00 sec)

7. Menampilkan semua data pelanggan secara urut berdasarkan nama pelanggan


secara DESCENDING
SELECT id_pelanggan, nm_pelanggan
FROM pelanggan ORDER BY nm_pelanggan DESC;

Hasil query di atas adalah sbb :


+--------------+------------------+
| id_pelanggan | nm_pelanggan
|
+--------------+------------------+
| P0001
| Yusuf Hadiwinata |
| P0002
| Yoga Rimaldo
|
| P0003
| Winny
|
| P0005
| Rea
|
| P0004
| Ninda Budianto
|
+--------------+------------------+
5 rows in set (0.00 sec)

8. Menampilkan 3 record (data) pertama dari tabel pelanggan secara urut

Page 45

MySQL Database Administration

versi 1.0 (Maret) 2015

berdasarkan nama pelanggan dengan LIMIT


SELECT id_pelanggan, nm_pelanggan
FROM pelanggan ORDER BY nm_pelanggan LIMIT 0,3;

Hasil query di atas adalah sbb :


+--------------+----------------+
| id_pelanggan | nm_pelanggan
|
+--------------+----------------+
| P0004
| Ninda Budianto |
| P0005
| Rea
|
| P0003
| Winny
|
+--------------+----------------+
3 rows in set (0.00 sec)

Keterangan
Pada query di atas bentuk LIMIT digunakan untuk membatasi hasil tampilan. LIMIT
banyak digunakan untuk menampilkan data yang relatif banyak. Format fungsi LIMIT
adalah sebagai berikut :
LIMIT awal, jumlah_record
9. Menampilkan jumlah record yang ada di tabel pelanggan.
SELECT COUNT(*)FROM pelanggan;

Hasil query di atas adalah sbb :


+----------+
| COUNT(*) |
+----------+
|
5 |
+----------+
1 row in set (0.04 sec)

Bab 5
Page 46

MySQL Database Administration

versi 1.0 (Maret) 2015

Fungsi-fungsi MySQL

Fungsi String

Fungsi Tanggal dan Waktu

Fungsi Numerik

Fungsi Lainnya

Fungsi String
MySQL memiliki banyak sekali fungsi yang berhubungan dengan operasi String.
Berikut ini beberapa fungsi string yang disediakan MySQL.

CONCAT (str1, str2, ...)


Fungsi ini digunakan untuk menggabungkan dua atau lebih string (kolom). Sebagai
contoh, misalnya akan menggabungkan kolom alamat dan telepon pada tabel
pelanggan menjadi sebuah kolom:
SELECT nm_pelanggan, CONCAT(alamat,' ',telepon) FROM pelanggan;

Hasil keluarannya:
+------------------+----------------------------+
| nm_pelanggan
| CONCAT(alamat,' ',telepon) |
+------------------+----------------------------+
| Yusuf Hadiwinata | Bekasi 085692019009
|
| Yoga Rimaldo
| Bandung 08571239501
|
| Winny
| Jakarta Barat 0815829221
|
| Ninda Budianto
| Jakarta Timur 08171231234 |
| Rea
| Jakarta Timur 085512312345 |
+------------------+----------------------------+
5 rows in set (0.04 sec)

CONCAT_WS (separator, str1, str2, ...)


Fungsi ini digunakan untuk menggabungkan dua atau lebih string (kolom) dengan
separator diantara masing-masing string. Contoh:
SELECT CONCAT_WS (',','Yusuf','Yoga','Rea');

Hasil keluarannya:
Yusuf, Yoga, Rea

Page 47

MySQL Database Administration

versi 1.0 (Maret) 2015

SUBSTR (string, awal, panjang)


SUBSTRING (string, awal, panjang)
SUBSTRING (string FROM awal FOR panjang)
MID (string, awal, panjang)
Fungsi ini digunakan untuk mengambil atau memotong string dimulai dari karakter
awal sebanyak panjang karakter. Sebagai catatan bahwa di MySQL, index string
dimulai dengan 1, bukan 0. Contoh:
SELECT SUBSTRING ('Budi Luhur',1,4);

Hasil keluarannya:
Budi

LENGTH (string)
OCTET_LENGTH (string)
CHAR_LENGTH (string)
CHARACTER_LENGTH (string)
Fungsi ini digunakan untuk menghitung panjang suatu string. Contoh:
SELECT LENGTH ('Budi Luhur');

Hasil keluarannya:
5

LEFT (string, panjang)


Fungsi ini digunakan untuk memotong string dari sebelah kiri sebanyak panjang
karakter. Contoh:
SELECT LEFT ('Budi Luhur', 4);

Hasil keluarannya:
Budi

RIGHT (string, panjang)


Fungsi ini digunakan untuk memotong string dari sebelah kanan sebanyak panjang

Page 48

MySQL Database Administration

versi 1.0 (Maret) 2015

karakter. Contoh:
SELECT RIGHT ('Budi Luhur', 4);

Hasil keluarannya:
Uhur

LTRIM (string)
Fungsi ini digunakan untuk menghilangkan spasi di awal string (kiri).
Contoh:
SELECT LTRIM (' Budi Luhur');

Hasil keluarannya:
Budi Luhur

RTRIM (string)
Fungsi ini digunakan untuk menghilangkan spasi di akhir string (kanan).
Contoh:
SELECT RTRIM ('Budi Luhur ');

Hasil keluarannya:
Budi Luhur

TRIM (string)
Fungsi ini digunakan untuk menghilangkan spasi di awal dan akhir string (kiri dan
kanan). Contoh:
SELECT TRIM (' Budi Luhur ');

Hasil keluarannya:
Budi Luhur

REPLACE (string, from_str, to_str)


Fungsi ini digunakan untuk mengganti suatu string dengan string yang lain.

Page 49

MySQL Database Administration

versi 1.0 (Maret) 2015

Contoh:
SELECT REPLACE ('www.mysql.com', 'w', 'x' );

Hasil keluarannya:
xxx.mysql.com

REPEAT (string, jumlah)


Fungsi ini digunakan untuk menduplikasi suatu string sebanyak jumlah.
Contoh:
SELECT REPEAT ('Mont', 3);

Hasil keluarannya:
MontMontMont

REVERSE (string)
Fungsi ini digunakan untuk membalik string. Contoh:
SELECT REVERSE ('mysql.com');

Hasil keluarannya:
moc.lqsym

LCASE (string)
LOWER (string)
Fungsi ini digunakan untuk mengubah string menjadi huruf kecil (lower- case).
Contoh:
SELECT LOWER ('MySQL');

Hasil keluarannya:
Mysql

UCASE (string)
UPPER (string)
Page 50

MySQL Database Administration

versi 1.0 (Maret) 2015

Fungsi ini digunakan untuk mengubah string menjadi huruf kapital (upper- case).
Contoh:
SELECT UPPER ('mysql');

Hasil keluarannya:
MYSQL

Fungsi Tanggal dan Waktu


Selain fungsi string, MySQL juga memiliki fungsi-fungsi yang berhubungan dengan
operasi tanggal dan waktu (date and time). Berikut ini beberapa fungsi tanggal dan waktu
yang disediakan MySQL.

NOW ()
SYSDATE()
Fungsi ini digunakan untuk mendapatkan tanggal dan waktu sistem sekarang
Contoh:
SELECT NOW();

Hasil keluarannya:
2015-03-31 20:00:31

MONTH (tanggal)
Fungsi ini digunakan untuk mendapatkan urutan bulan (integer) dari suatu tanggal
yang diberikan dalam setahun, dimana 1=Januari, 2=Februari, dst. Contoh:
SELECT MONTH (1982-06-05);

Hasil keluarannya:
6

WEEK (tanggal)
Fungsi ini digunakan untuk mendapatkan urutan minggu (integer) dari suatu tanggal

Page 51

MySQL Database Administration

versi 1.0 (Maret) 2015

yang diberikan dalam setahun. Contoh:


SELECT WEEK (1982-06-05);

Hasil keluarannya:
22

YEAR (tanggal)
Fungsi ini digunakan untuk mendapatkan bilangan tahun dari suatu tanggal yang
diberikan. Contoh:
SELECT YEAR (now());

Hasil keluarannya:
2015

HOUR (waktu)
Fungsi ini digunakan untuk mendapatkan bilangan jam dari suatu parameter waktu
yang diberikan. Contoh:
SELECT HOUR (now());

Hasil keluarannya:
20

MINUTE (waktu)
Fungsi ini digunakan untuk mendapatkan bilangan menit dari suatu parameter
waktu yang diberikan. Contoh:
SELECT MINUTE (now());

Hasil keluarannya:
8

SECOND (waktu)
Fungsi ini digunakan untuk mendapatkan bilangan detik dari suatu waktu yang

Page 52

MySQL Database Administration

versi 1.0 (Maret) 2015

diberikan. Contoh:
SELECT SECOND (now());

Hasil keluarannya:
53

DATE_ADD(date,INTERVAL expr type)


DATE_SUB(date,INTERVAL expr type)
ADDDATE(date,INTERVAL expr type)
SUBDATE(date,INTERVAL expr type)
Fungsi-fungsi diatas digunakan untuk menambah suatu tanggal. Contoh:
SELECT DATE_ADD(now(), INTERVAL 1 DAY);

Hasil keluarannya:
2015-03-31 20:12:17

DATE_FORMAT(date, format)
Fungsi ini digunakan untuk mem-format tampilan tanggal.

TIME_FORMAT(time, format)
Fungsi ini digunakan untuk mem-format tampilan waktu.
Berikut ini format tampilan tanggal dan waktu, dan penggunaannya:
%M

: Nama bulan (January ... December)

%W

: Nama hari dalam seminggu (Sunday...Saturday)

%D

: Urutan hari dalam sebulan

%Y

: Tahun, 4 digit

%y

: Tahun, 2 digit

%a

: Nama hari dalam seminggu (Sun...Saturday)

%H

: Jam, dalam format 24.

%i

: Menit, 00-59

%s

: Detik, 00-59

SELECT DATE_FORMAT (now(), '%d-%M-%Y %H:%i:%s');

Hasil keluarannya:

Page 53

MySQL Database Administration

versi 1.0 (Maret) 2015

31-03-2015 20:12:17

Fungsi Numerik
MySQL memiliki fungsi-fungsi yang berhubungan dengan operasi numerik, berikut
ini contohnya:

OPERASI ARITMATIKA
Operasi aritmatika dalam MySQL terdiri dari:
+

: Pertambahan

: Pengurangan

: Perkalian

: Pembagian

: Sisa hasil bagi, modulus

Contoh penggunaan:
SELECT 10+20;

Hasil keluarannya:
30

SELECT 10/3;

Hasil keluarannya:
3.3333

ABS(x)
Fungsi digunakan untuk mengambil nilai absolut dari bilangan x. Contoh:
SELECT ABS(-20);

Hasil keluarannya:
20

Page 54

MySQL Database Administration

versi 1.0 (Maret) 2015

MOD(m, n)
Fungsi digunakan untuk mengoperasikan m modulus n. Contoh:
SELECT MOD(10,3);

Hasil keluarannya:
1

FLOOR(x)
Fungsi digunakan untuk mengambil nilai integer terbesar yang tidak lebih besar dari
x. Contoh:
SELECT FLOOR(10.3576);

Hasil keluarannya:
10

CEILING(x)
Fungsi digunakan untuk mengambil nilai integer terkecil yang tidak lebih kecil dari x.
Contoh:
SELECT CEILING(10.3576);

Hasil keluarannya:
11

ROUND(x)
ROUND(x, d)
Fungsi digunakan untuk melakukan pembulatan bilangan x sebanyak d tempat
presisi. Contoh:
SELECT ROUND(10.3576, 2);

Hasil keluarannya:
10.36

POW(x)
POWER(x, n)
Page 55

MySQL Database Administration

versi 1.0 (Maret) 2015

Fungsi digunakan untuk melakukan mengambil hasil pemangkatan dari xn.


Contoh:
SELECT POW(2, 10);

Hasil keluarannya:
1024

RAND()
RAND(x)
Fungsi digunakan untuk mengambil nilai random diantara 0 s/d 1.0. Contoh:
SELECT RAND();

Hasil keluarannya:
0.96589817662341

TRUNCATE(x, d)
Fungsi digunakan untuk memotong bilangan x sepanjang d tempat desimal.
Contoh:
SELECT TRUNCATE(10.28372, 1);

Hasil keluarannya:
10.2

Fungsi Lainnya
Selain fungsi yang berhubungan dengan string, date-and-time, dan numerik MySQL
juga memiliki fungsi-fungsi khusus, diantaranya :

GREATEST(nil1, nil2, ...)


Fungsi digunakan untuk mengambil nilai terbesar dari suatu kumpulan nilai.
Contoh:
SELECT GREATEST(2,5,2,6,3,7,4,2,5,1);

Page 56

MySQL Database Administration

versi 1.0 (Maret) 2015

Hasil keluarannya:
7

COUNT(range)
Fungsi digunakan untuk mengambil jumlah baris dari suatu query. Contoh:
SELECT COUNT(*) FROM pelanggan;

Hasil keluarannya:
5

MAX(range)
Fungsi digunakan untuk mengambil nilai terbesar dari suatu ekspresi (query).
Contoh:
SELECT MAX(nilai) FROM nilai_ujian;

Hasil keluarannya:
93

MIN(range)
Fungsi digunakan untuk mengambil nilai terkecil dari suatu ekspresi (query).
Contoh:
SELECT MIN(nilai) FROM nilai_ujian;

Hasil keluarannya:
40

SUM(range)
Fungsi digunakan untuk menjumlahkan total nilai dari suatu ekspresi (query).
Contoh:
SELECT SUM(nilai) FROM nilai_ujian;

Hasil keluarannya:
450

Page 57

MySQL Database Administration

versi 1.0 (Maret) 2015

AVG(range)
Fungsi digunakan untuk menghitung rata-rata nilai dari suatu ekspresi (query).
Contoh:
SELECT AVG(nilai) FROM nilai_ujian;

Hasil keluarannya:
78

OPERASI BITWISE
Operasi bitwise dalam MySQL terdiri dari:
|

: Bitwise OR

&

: Bitwise AND

<<

: Shift Kiri

>>

: Shift Kanan

: Invert, negasi

Contoh penggunaan:
SELECT 4 | 2;

Hasil keluarannya:
6

DATABASE()
Fungsi digunakan untuk mengambil nama database yang sedang aktif (terbuka).
Contoh:
SELECT DATABASE();

Hasil keluarannya:
Penjualan

USER()
SYSTEM_USER()
Page 58

MySQL Database Administration

versi 1.0 (Maret) 2015

SESSION_USER()
Fungsi digunakan untuk mengambil user yang sedang digunakan (aktif).
Contoh:
SELECT USER();

Hasil keluarannya:
root@localhost

PASSWORD(str)
Fungsi digunakan untuk melakukan enkripsi suatu string. Sifat utama dari fungsi
password() ini adalah hasilnya selalu sama untuk setiap string yang sama. String
hasil dari fungsi password() tidak dapat di-decript (decode). Biasanya fungsi ini
digunakan untuk menyimpan password login.
Contoh:
SELECT PASSWORD('qwerty');

Hasil keluarannya:
*AA1420F182E88B9E5F874F6FBE7459291E8F4601

ENCODE(str, pass)
Fungsi digunakan untuk melakukan enkripsi suatu string str menggunakan
password atau key pass. Contoh:
SELECT ENCODE('qwerty', 'password');

Hasil keluarannya:
WkPH:

DECODE(encripted_str, pass)
Fungsi

digunakan

untuk

melakukan

dekripsi

suatu

string

encripted_str

menggunakan password atau key pass. Jika passwordnya benar, maka string
aslinya akan benar. Contoh:
SELECT DECODE('ce|', 'password');

Hasil keluarannya:

Page 59

MySQL Database Administration

versi 1.0 (Maret) 2015

Qwerty

Contoh dengan password salah:


SELECT DECODE('ce|', 'ngasal');

Hasil keluarannya:
WkPH:

MD5(str)
Fungsi digunakan untuk melakukan enkripsi suatu string str menggunakan metode
md5. Fungsi ini juga tidak dapat didekripsi. Contoh:
SELECT MD5('qwerty');

Hasil keluarannya:
d8578edf8458ce06fbc5bb76a58c5ca4

LAST_INSERT_ID()
Fungsi digunakan untuk mengambil id terakhir dalam proses insert dimana tabelnya
mengandung field yang bersifat AUTO INCREMENT. Contoh:
SELECT LAST_INSERT_ID();

Hasil keluarannya:
231

VERSION()
Fungsi digunakan untuk mengambil versi MySQL yang digunakan. Contoh:
SELECT VERSION();

Hasil keluarannya:
5.0.45-community-nt

Page 60

MySQL Database Administration

versi 1.0 (Maret) 2015

Bagian 3

PERINTAH MySQL LANJUTAN

Bab 6
Perintah MySQL Lanjutan
Page 61

MySQL Database Administration

versi 1.0 (Maret) 2015

Perintah SELECT dari Banyak Tabel

Pengelompokkan Hasil Query dengan GROUP BY

HAVING

SubSELECT

Menampilkan Record secara Random

Transaksi

Pada bab ini akan dijelaskan beberapa perintah SQL lanjutan yang lebih kompleks
seperti join antar tabel, grouping, sub select, random search dan transaksi (commit-androolback). Untuk mempermudah penjelasan, maka semua contoh yang disajikan di bab ini
mengacu pada pemodelan data konseptual Sistem Pemesanan (Penjualan) Barang sbb:

Untuk membuat tabel-tabel dari rancangan di atas, kita akan menggunakan tipe tabel
InnoDB karena nantinya kita akan menggunakan transaksi di sistem tersebut. Dan berikut
ini spesifikasi basis data dari pemodelan data konseptual di atas:
DROP TABLE IF EXISTS detil_pesan;
CREATE TABLE detil_pesan (
id_pesan int(5) NOT NULL,
id_produk varchar(5) NOT NULL,
jumlah int(5) NOT NULL default '0',
harga decimal(10,0) NOT NULL default '0',
PRIMARY KEY (id_pesan,id_produk),
KEY FK_pesan (id_produk),
KEY id_pesan (id_pesan),
CONSTRAINT FK_pesan FOREIGN KEY (id_produk)
REFERENCES produk (id_produk),

Page 62

MySQL Database Administration

versi 1.0 (Maret) 2015

CONSTRAINT FK_pesan2 FOREIGN KEY (id_pesan)


REFERENCES pesan (id_pesan)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*Table structure for table faktur */
DROP TABLE IF EXISTS faktur;
CREATE TABLE faktur (
id_faktur int(5) NOT NULL auto_increment,
id_pesan int(5) NOT NULL,
tgl_faktur date NOT NULL,
PRIMARY KEY (id_faktur),
KEY id_pesan (id_pesan),
CONSTRAINT faktur_ibfk_1 FOREIGN KEY (id_pesan)
REFERENCES pesan (id_pesan)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*Table structure for table kuitansi */
DROP TABLE IF EXISTS kuitansi;
CREATE TABLE kuitansi (
id_kuitansi int(5) NOT NULL auto_increment,
id_faktur int(5) NOT NULL,
tgl_kuitansi date NOT NULL,
PRIMARY KEY (id_kuitansi),
KEY FK_kuitansi (id_faktur),
CONSTRAINT FK_kuitansi FOREIGN KEY (id_faktur)
REFERENCES faktur (id_faktur)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*Table structure for table pelanggan */
DROP TABLE IF EXISTS pelanggan;
CREATE TABLE pelanggan (
id_pelanggan varchar(5) NOT NULL,
nm_pelanggan varchar(40) NOT NULL,
alamat text NOT NULL,
telepon varchar(20) NOT NULL,
email varchar(50) NOT NULL,
PRIMARY KEY (id_pelanggan)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 CHECKSUM=1
DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC;
/*Table structure for table pesan */
DROP TABLE IF EXISTS pesan;
CREATE TABLE pesan (
id_pesan int(5) NOT NULL auto_increment,
id_pelanggan varchar(5) NOT NULL,
tgl_pesan date NOT NULL,
PRIMARY KEY (id_pesan),
KEY id_pelanggan (id_pelanggan),
CONSTRAINT pesan_ibfk_2 FOREIGN KEY (id_pelanggan)
REFERENCES pelanggan (id_pelanggan)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
/*Table structure for table produk */
DROP TABLE IF EXISTS produk;
CREATE TABLE produk (
id_produk varchar(5) NOT NULL,
nm_produk varchar(30) NOT NULL,
satuan varchar(10) NOT NULL,
harga decimal(10,0) NOT NULL default '0',
stock int(3) NOT NULL default '0',
PRIMARY KEY (id_produk)

Page 63

MySQL Database Administration

versi 1.0 (Maret) 2015

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Selanjutnya, untuk memudahkan dalam pemberian contoh, isilah tabel-tabel diatas


dengan record (data) secukupnya.

Perintah SELECT dari Banyak Tabel dengan JOIN


Di dalam suatu RDBMS tentunya sudah menjadi suatu kewajaran jika dalam satu
database dapat terdiri dari beberapa tabel. Masing-masing tabel tersebut berhubungan
satu sama lain atau dengan kata lain memiliki relasi. Relasi antar- tabel dapat berupa
relasi 1-1, 1-M, atau M-N. Sebagai contoh terlihat pada gambar pemodelan data
konseptual (class diagram) di atas. Tabel pelanggan berhubungan dengan pesan, pesan
dengan barang, dsb.
Pada praktisnya, terkadang kita juga memerlukan tampilan data yang tidak hanya
berasal dari 1 (satu) tabel, namun bisa dari beberapa tabel sekaligus. Contohnya, dari
class diagram diatas, kita ingin menampilkan nama pelanggan berikut transaksi yang
pernah dilakukannya. Dari contoh tersebut, kita harus bisa menggabungkan minimal dua
tabel, yaitu pelanggan dan pesan. Untuk menggabungkan 2 (dua) atau lebih tabel, kita
dapat menggunakan bentuk perintah JOIN.

Inner Join
Dengan inner join, tabel akan digabungkan dua arah, sehingga tidak ada data yang
NULL di satu sisi. Sebagai contoh, kita akan menggabungkan tabel pelanggan dan pesan
dimana kita akan menampilkan daftar pelanggan yang pernah melakukan pemesanan
(transaksi). Isi tabel pelanggan dan pesan adalah sebagai berikut :
Tabel pelanggan (hanya ditampilkan id, nama dan email).
+--------------+------------------+---------------+--------------+----------------------------+
| id_pelanggan | nm_pelanggan
| alamat
| telepon
| email
|
+--------------+------------------+---------------+--------------+----------------------------+
| P0001
| Yusuf Hadiwinata | Bekasi
| 085692019009 | yusuf.hadiwinata@gmail.com |
| P0002
| Yoga Rimaldo
| Bandung
| 08571239501 | yoga@computradetech.com
|
| P0003
| Winny
| Jakarta Barat | 0815829221
| winny@computradetech.com
|
| P0004
| Ninda Budianto
| Jakarta Timur | 08171231234 | ninda@computradetech.com
|
+--------------+------------------+---------------+--------------+----------------------------+
4 rows in set (0.00 sec)

Tabel pesan:
+----------+--------------+------------+

Page 64

MySQL Database Administration

versi 1.0 (Maret) 2015

| id_pesan | id_pelanggan | tgl_pesan |


+----------+--------------+------------+
|
1 | P0001
| 2008-02-02 |
|
2 | P0002
| 2008-02-05 |
|
3 | P0002
| 2008-02-10 |
|
4 | P0004
| 2008-01-20 |
|
5 | P0004
| 2007-12-14 |
+----------+--------------+------------+
5 rows in set (0.00 sec)

Cara 1 : Penggabungan dengan WHERE


Bentuk umum
SELECT tabel1.*, tabel2.* FROM tabel1, tabel2
WHERE tabel1.PK=tabel2.FK;

Berikut ini perintah SQL untuk menggabungkan tabel pelanggan dan pesan:
SELECT pelanggan.id_pelanggan, pelanggan.nm_pelanggan,
pesan.id_pesan, pesan.tgl_pesan
FROM pelanggan, pesan
WHERE pelanggan.id_pelanggan=pesan.id_pelanggan;

Hasilnya :
+--------------+------------------+----------+------------+
| id_pelanggan | nm_pelanggan
| id_pesan | tgl_pesan |
+--------------+------------------+----------+------------+
| P0001
| Yusuf Hadiwinata |
1 | 2008-02-02 |
| P0002
| Yoga Rimaldo
|
2 | 2008-02-05 |
| P0002
| Yoga Rimaldo
|
3 | 2008-02-10 |
| P0004
| Ninda Budianto
|
4 | 2008-01-20 |
| P0004
| Ninda Budianto
|
5 | 2007-12-14 |
+--------------+------------------+----------+------------+
5 rows in set (0.01 sec)

Pada hasil perintah query di atas terlihat bahwa terdapat 5 (lima) transaksi yang dilakukan
oleh 3 (tiga) orang pelanggan. Jika kita lihat kembali isi tabel pelanggan di atas, maka
terdapat satu pelanggan yang tidak ditampilkan yaitu yang memiliki id pelanggan P0003.
Pelanggan tersebut tidak ditampilkan karena belum pernah melakukan transaksi.

Cara 2 : Penggabungan dengan INNER JOIN


Bentuk umum
SELECT tabel1.*, tabel2.*
FROM tabel1 INNER JOIN tabel2
ON tabel1.PK=tabel2.FK;

Berikut ini perintah SQL untuk menggabungkan tabel pelanggan dan pesan:

Page 65

MySQL Database Administration

versi 1.0 (Maret) 2015

SELECT pelanggan.id_pelanggan, pelanggan.nm_pelanggan,


pesan.id_pesan, pesan.tgl_pesan
FROM pelanggan INNER JOIN pesan
ON pelanggan.id_pelanggan=pesan.id_pelanggan;

Hasilnya:
+--------------+------------------+----------+------------+
| id_pelanggan | nm_pelanggan
| id_pesan | tgl_pesan |
+--------------+------------------+----------+------------+
| P0001
| Yusuf Hadiwinata |
1 | 2008-02-02 |
| P0002
| Yoga Rimaldo
|
2 | 2008-02-05 |
| P0002
| Yoga Rimaldo
|
3 | 2008-02-10 |
| P0004
| Ninda Budianto
|
4 | 2008-01-20 |
| P0004
| Ninda Budianto
|
5 | 2007-12-14 |
+--------------+------------------+----------+------------+
5 rows in set (0.00 sec)

Outer Join
Dengan outer join, tabel akan digabungkan satu arah, sehingga memungkinkan ada
data yang NULL (kosong) di satu sisi. Sebagai contoh, kita akan menggabungkan tabel
pelanggan dan pesan dimana kita akan menampilkan daftar pelanggan yang pernah
melakukan pemesanan (transaksi).
Outer Join terbagi menjadi 2 (dua) yaitu LEFT JOIN dan RIGHT. Berikut ini bentuk
umum dan contohnya:

LEFT JOIN
Bentuk umum
SELECT tabel1.*, tabel2.*
FROM tabel1 LEFT JOIN tabel2
ON tabel1.PK=tabel2.FK;

Berikut ini perintah SQL untuk menggabungkan tabel pelanggan dan pesan:
SELECT pelanggan.id_pelanggan, pelanggan.nm_pelanggan,
pesan.id_pesan, pesan.tgl_pesan
FROM pelanggan LEFT JOIN pesan
ON pelanggan.id_pelanggan=pesan.id_pelanggan;

Hasilnya :
+--------------+------------------+----------+------------+
| id_pelanggan | nm_pelanggan
| id_pesan | tgl_pesan |
+--------------+------------------+----------+------------+
| P0001
| Yusuf Hadiwinata |
1 | 2008-02-02 |
| P0002
| Yoga Rimaldo
|
2 | 2008-02-05 |
| P0002
| Yoga Rimaldo
|
3 | 2008-02-10 |
| P0003
| Winny
|
NULL | NULL
|

Page 66

MySQL Database Administration

versi 1.0 (Maret) 2015

| P0004
| Ninda Budianto
|
4 | 2008-01-20 |
| P0004
| Ninda Budianto
|
5 | 2007-12-14 |
+--------------+------------------+----------+------------+
6 rows in set (0.00 sec)

Berbeda dengan hasil sebelumnya (inner join), penggunaan left join akan menampilkan
juga data pelanggan dengan id P0003, walaupun pelanggan tersebut belum pernah
bertransaksi. Dan pada kolom id_pesan dan tgl_pesan untuk pelanggan P0003 isinya
NULL, artinya di tabel kanan (pesan) pelanggan tersebut tidak ada.

RIGHT JOIN
Bentuk umum
SELECT tabel1.*, tabel2.*
FROM tabel1 RIGHT JOIN tabel2
ON tabel1.PK=tabel2.FK;

Berikut ini perintah SQL untuk menggabungkan tabel pelanggan dan pesan:
SELECT pelanggan.id_pelanggan, pelanggan.nm_pelanggan,
pesan.id_pesan, pesan.tgl_pesan
FROM pelanggan RIGHT JOIN pesan
ON pelanggan.id_pelanggan=pesan.id_pelanggan;

Hasilnya :
+--------------+------------------+----------+------------+
| id_pelanggan | nm_pelanggan
| id_pesan | tgl_pesan |
+--------------+------------------+----------+------------+
| P0001
| Yusuf Hadiwinata |
1 | 2008-02-02 |
| P0002
| Yoga Rimaldo
|
2 | 2008-02-05 |
| P0002
| Yoga Rimaldo
|
3 | 2008-02-10 |
| P0004
| Ninda Budianto
|
4 | 2008-01-20 |
| P0004
| Ninda Budianto
|
5 | 2007-12-14 |
+--------------+------------------+----------+------------+
5 rows in set (0.00 sec)

Dengan right join, tabel yang menjadi acuan adalah tabel sebelah kanan (tabel pesan),
jadi semua isi tabel pesan akan ditampilkan. Jika data pelanggan tidak ada di tabel
pelanggan, maka isi tabel pesan tetap ditampilkan.

Menggabungkan Tiga Tabel


Untuk menggabungkan tiga tabel atau lebih, pada dasarnya sama dengan
penggabungan 2 (dua) tabel. Sebagai contoh misalnya kita akan menampilkan barangbarang yang dipesan beserta nama barang dan harganya untuk pemesanan dengan
nomor 1. Berikut ini perintah SQL-nya:

Page 67

MySQL Database Administration

versi 1.0 (Maret) 2015

SELECT pesan.id_pesan, produk.id_produk, produk.nm_produk,


detil_pesan.harga, detil_pesan.jumlah
FROM pesan, detil_pesan, produk
WHERE pesan.id_pesan=detil_pesan.id_pesan AND
detil_pesan.id_produk=produk.id_produk
AND pesan.id_pesan='1' ;

Hasilnya:
+----------+-----------+------------+-------+--------+
| id_pesan | id_produk | nm_produk | harga | jumlah |
+----------+-----------+------------+-------+--------+
|
1 | B0001
| Buku Tulis | 2700 |
2 |
|
1 | B0003
| Penggaris | 3000 |
3 |
|
1 | B0004
| Pensil
| 2000 |
1 |
+----------+-----------+------------+-------+--------+
3 rows in set (0.01 sec)

Pengelompokkan Hasil Query dengan GROUP BY


Hasil query terkadang perlu dikelompokkan berdasarkan kriteria atau kondisi
tertentu. Misalnya kita akan menampilkan jumlah barang yang dibeli untuk masing-masing
transaksi (pemesanan). Perhatikan perintah query berikut ini dan lihat hasilnya:
SELECT pesan.id_pesan, pesan.tgl_pesan,
detil_pesan.jumlah
FROM pesan, detil_pesan
WHERE pesan.id_pesan=detil_pesan.id_pesan;

Hasilnya:
+----------+------------+--------+
| id_pesan | tgl_pesan | jumlah |
+----------+------------+--------+
|
1 | 2008-02-02 |
2 |
|
1 | 2008-02-02 |
3 |
|
1 | 2008-02-02 |
1 |
+----------+------------+--------+
3 rows in set (0.00 sec)

Jika kita perhatikan hasil perintah query di atas, kita akan mendapatkan jumlah
barang yang terjadi untuk setiap transaksi, namun hasil tampilannya masih per-barang.
Artinya jumlah yang ditampilkan masih berupa jumlah barang untuk masing-masing
barang.
Agar

jumlah barang ditampilkan per-transaksi (pemesanan), maka kita dapat

menggunakan fungsi GROUP BY dan juga SUM untuk menjumlahkan jumlah barang.
Berikut ini perintah query dengan group by dan count.

Page 68

MySQL Database Administration

versi 1.0 (Maret) 2015

SELECT pesan.id_pesan, pesan.tgl_pesan,


SUM(detil_pesan.jumlah) as jumlah
FROM pesan, detil_pesan
WHERE pesan.id_pesan=detil_pesan.id_pesan
GROUP BY id_pesan;

Hasilnya:
+----------+------------+--------+
| id_pesan | tgl_pesan | jumlah |
+----------+------------+--------+
|
1 | 2008-02-02 |
6 |
+----------+------------+--------+
1 row in set (0.05 sec)
Selain hasil di atas, kita juga dapat menggunakan tambahan WITH ROLLUP di belakang
group by untuk menampilkan jumlah total seluruh barang. Berikut ini perintah query dan
hasilnya:
SELECT pesan.id_pesan, pesan.tgl_pesan,
SUM(detil_pesan.jumlah) as jumlah
FROM pesan, detil_pesan
WHERE pesan.id_pesan=detil_pesan.id_pesan
GROUP BY id_pesan WITH ROLLUP;

Hasilnya:
+----------+------------+--------+
| id_pesan | tgl_pesan | jumlah |
+----------+------------+--------+
|
1 | 2008-02-02 |
6 |
|
NULL | 2008-02-02 |
6 |
+----------+------------+--------+
2 rows in set (0.03 sec)

HAVING
Perintah query berikut ini akan menampilkan jumlah item (jenis) barang untuk tiap
transaksi.
SELECT pesan.id_pesan, COUNT(detil_pesan.id_produk) as jumlah
FROM pesan, detil_pesan
WHERE pesan.id_pesan=detil_pesan.id_pesan
GROUP BY pesan.id_pesan ;

Hasilnya:
+----------+--------+

Page 69

MySQL Database Administration

versi 1.0 (Maret) 2015

| id_pesan | jumlah |
+----------+--------+
|
1 |
3 |
+----------+--------+
1 row in set (0.00 sec)

Dari hasil query di atas tampak bahwa ditampilkan jumlah item barang untuk semua
transaksi. Selanjutnya bagaimana jika kita ingin hanya menampilkan data yang jumlah
item barangnya lebih dari 2 (dua)? Mungkin kita langsung berfikir untuk menggunakan
WHERE seperti perintah query sebagai berikut:
SELECT pesan.id_pesan, COUNT(detil_pesan.id_produk) as jumlah
FROM pesan, detil_pesan
WHERE pesan.id_pesan=detil_pesan.id_pesan
AND jumlah > 2
GROUP BY pesan.id_pesan ;

Hasilnya ternyata tidak sesuai yang diinginkan. Lihat hasilnya sebagai berikut:
+----------+--------+
| id_pesan | jumlah |
+----------+--------+
|
1 |
1 |
+----------+--------+
1 row in set (0.00 sec)

Hal tersebut terjadi karena kondisi dalam WHERE tidak dapat diterapkan pada fungsi
agregrasi seperti COUNT, SUM, AVG dll. Untuk menyeleksi suatu fungsi agregasi, kita
tidak dapat menggunakan WHERE, namun kita dapat menggunakan HAVING. Berikut ini
perintah query yang menggunakan HAVING:
SELECT pesan.id_pesan, COUNT(detil_pesan.id_produk) as jumlah
FROM pesan, detil_pesan
WHERE pesan.id_pesan=detil_pesan.id_pesan
GROUP BY pesan.id_pesan
HAVING jumlah > 2 ;

Lihat hasilnya sebagai berikut:


+----------+--------+
| id_pesan | jumlah |
+----------+--------+
|
1 |
3 |
+----------+--------+
1 row in set (0.00 sec)

Page 70

MySQL Database Administration

versi 1.0 (Maret) 2015

SubSELECT
Mulai versi 4.1, MySQL mendukung perintah query SubSELECT dimana
memungkinkan untuk melakukan query di dalam query. Misalnya kita akan menampilkan
data yang kondisinya merupakan hasil dari query lain.
Perintah SubSELECT memiliki banyak variasi. Berikut ini beberapa variasi bentuk
perintah SubSELECT.
SELECT
SELECT
SELECT
SELECT
SELECT

... WHERE col=[ANY|ALL] (SELECT ...);


... WHERE col [NOT] IN (SELECT ...);
ROW(val1,val2,..) =[ANY] (SELECT col1,col2,..);
... WHERE col = [NOT] EXISTS (SELECT ...);
... FROM (SELECT ...) AS name WHERE ...;

Dan berikut ini beberapa contoh perintah query yang menggunakan SubSELECT.

Menampilkan daftar pelanggan yang pernah melakukan transaksi (pemesanan).

SELECT id_pelanggan, nm_pelanggan FROM pelanggan


WHERE id_pelanggan IN (SELECT id_pelanggan FROM pesan);

Hasilnya sebagai berikut:


+--------------+------------------+
| id_pelanggan | nm_pelanggan
|
+--------------+------------------+
| P0001
| Yusuf Hadiwinata |
| P0002
| Yoga Rimaldo
|
| P0004
| Ninda Budianto
|
+--------------+------------------+
3 rows in set (0.01 sec)

Menampilkan data pemesanan dengan jumlah barang terbanyak.

SELECT id_pesan, jumlah FROM detil_pesan


WHERE jumlah = ( SELECT MAX(jumlah) FROM detil_pesan);

Hasilnya:
+----------+--------+
| id_pesan | jumlah |
+----------+--------+
|
1 |
3 |
+----------+--------+
1 row in set (0.00 sec)

Page 71

MySQL Database Administration

versi 1.0 (Maret) 2015

Menampilkan Record secara Random


MySQL memiliki fungsi khusus yang dapat digunakan untuk menampilkan record
secara acak (random). Seperti kita ketahui bahwa pada perintah SELECT record akan
ditampilkan secara urut berdasarkan urutan saat penginputan (FIFO = First In First Out).
Berikut ini contoh perintah query untuk menampilkan data pelanggan secara acak
(random):
SELECT id_pelanggan, nm_pelanggan, email
FROM pelanggan ORDER BY RAND() ;

Salah satu hasilnya sebagai berikut:


+--------------+------------------+----------------------------+
| id_pelanggan | nm_pelanggan
| email
|
+--------------+------------------+----------------------------+
| P0004
| Ninda Budianto
| ninda@computradetech.com
|
| P0001
| Yusuf Hadiwinata | yusuf.hadiwinata@gmail.com |
| P0002
| Yoga Rimaldo
| yoga@computradetech.com
|
| P0003
| Winny
| winny@computradetech.com
|
+--------------+------------------+----------------------------+
4 rows in set (0.02 sec)

Transaksi
MySQL merupakan software database berbasis client-server. Hal ini berarti bahwa
beberapa client dapat melakukan koneksi ke server MySQL secara bersamaan. Masingmasing client dapat melakukan select, insert, update, maupun delete data di server
MySQL. Hal ini tentunya dapat menjadi masalah jika terjadi bentrok antar-client.
Sebagai contoh dalam proses transaksi pemesanan barang. Jika terdapat 2 (dua)
pelanggan melakukan transaksi pada waktu yang sama, misalnya melakukan pemesanan
barang. Keduanya akan menambahkan data di tabel yang sama dan mungkin saja data
yang dimasukkan tertukar atau tidak valid. Hal ini tidak akan terjadi jika pada saat satu
pelanggan melakukan transaksi, pelanggan yang lain harus menunggu sampai proses
transaksi selesai.
Untuk mengatur proses query yang terjadi dalam suatu sistem yang memiliki user
banyak (multi-user-system), kita dapat memanfaatkan dua hal di MySQL. Pertama kita
dapat mengunci tabel (table-locking). Cara ini dapat dilakukan jika tipe tabel yang
digunakan adalah MyISAM. Kedua, dapat menggunakan perintah BEGIN, COMMIT dan

Page 72

MySQL Database Administration

versi 1.0 (Maret) 2015

ROLLBACK. Cara ini dapat dilakukan jika tipe tabel adalah tabel transaksi, yaitu InnoDB.
Terdapat 4 (empat) prinsip dasar transaksi yang biasa disingkat sebagai ACID,
yaitu:
Atomicity.
Atom merupakan komponen terkecil dari materi, atau sesuatu yang tidak dapat
dibagi-bagi lagi. Prinsip ini berlaku pada proses transaksi. Semua proses (perintah)
yang ada di dalam satu paket transaksi harus selesai semua atau tidak selesai
sama sekali. Dengan kata lain, dalam satu transaksi tidak boleh ada proses
(perintah) yang gagal dieksekusi.
Consistency.
Bahwa kegagalan satu proses dalam transaksi tidak akan mempengaruhi transaksi
lainnya.
Isolation.
Secara sederhana, bahwa data yang sedang digunakan dalam satu transaksi, tidak
dapat digunakan oleh transaksi lainnya sebelum seluruh proses transaksi yang
pertama selesai.
Durability.
Jika sebuah transaksi selesai dieksekusi, hasilnya tetap tercatat dengan baik.

Mengunci Tabel
Mengunci tabel (table-locking) dapat dilakukan untuk membatasi akses terhadap
suatu tabel jika ada user yang sedang aktif mengakses tabel. Suatu tabel yang sedang
terkunci (locked), tidak dapat diakses dengan bebas oleh user lain. Untuk mengunci tabel
di MySQL dapat menggunakan kata kunci LOCK.
Bentuk umum perintah LOCK :
LOCK TABLE table1 locktype, table2 locktype, ...;

Dimana tipe lock (locktype) yang dapat dipilih antara lain:


READ.
Semua user MySQL dapat membaca (mengakses) tabel, namun tabel tersebut

Page 73

MySQL Database Administration

versi 1.0 (Maret) 2015

tidak dapat diubah oleh siapapun, termasuk user yang mengeksekusi perintah
LOCK. Dengan kata lain, tabel bersifat read-only.
READ LOCAL.
Sama seperti READ, tetapi perintah INSERT dapat dilakukan selama tidak merubah
record (data) yang ada.
WRITE.
User yang aktif diperbolehkan untuk membaca dan mengubah tabel (read-andwrite). User yang lain tidak dapat mengubah isi tabel, hanya dapat membaca tabel
(read-only).
LOW PRIORITY WRITE.
Seperti halnya WRITE, hanya saja user lain dapat melakukan READ LOCK.
Untuk membuka tabel yang terkunci, gunakan perintah UNLOCK TABLES;
Contoh table-locking:
LOCK TABLES trans READ, customer WRITE;
SELECT sum(value) FROM trans WHERE customer_id= some_id;
UPDATE customer SET total_value=total
WHERE customer_id=some_id;
UNLOCK TABLES;

BEGIN, COMMIT dan ROLLBACK


BEGIN atau START TRANSACTION digunakan untuk memulai transaksi, COMMIT
untuk mengakhiri transaksi dan menyimpan semua perubahan, sedangkan ROLLBACK
digunakan untuk menghentikan proses transaksi dan mengabaikan semua perubahan
yang telah dilakukan.
Pada tipe tabel InnoDB, tidak berlaku transaksi didalam transaksi (nestedtransaction), artinya jika perintah BEGIN dieksekusi sebelum transaksi selesai dilakuka
(perintah COMMIT), maka secara otomatis, perintah COMMIT akan dieksekusi terlebih
dahulu.
Perintah transaksi diatur oleh client. Jika pada saat proses transaksi berlangsung,
koneksi client dengan server terputus, maka secara otomatis, MySQL akan membatalkan
semua perubahan yang sudah terjadi (seperti halnya mengeksekusi perintah ROLLBACK).

Page 74

MySQL Database Administration

versi 1.0 (Maret) 2015

Bentuk umum perintah transaksi :


BEGIN;
SELECT | INSERT | UPDATE | DELETE;
COMMIT;

Contoh :
SET AUTOCOMMIT=0;
BEGIN;
INSERT INTO pesan VALUES(NULL,'P0001',now());
SET @id := LAST_INSERT_ID();
INSERT INTO detil_pesan VALUES (@id,'B0001','2','2500');
COMMIT;

Page 75

MySQL Database Administration

versi 1.0 (Maret) 2015

Bab 7
Administrasi dan Keamanan di MySQL

Keamanan di MySQL

Memahami Hak Akses (Priviledges) di MySQL

Grant dan Revoke di MySQL

Menambah dan Mengatur Hak Akses User

Menghapus Hak Akses User

Mengganti Password User

Keamanan di MySQL
Masalah keamanan (security) di MySQL merupakan hal yang tidak boleh dianggap
sepele apalagi dikesampingkan. MySQL merupakan software database yang bersifat
client-server, yang memungkinkan beberapa user dapat mengakses server MySQL dari
mana pun. Untuk itu, server MySQL harus benar-benar aman dari akses (serangan)
orang-orang yang tidak berhak.
Berikut ini beberapa hal yang harus diperhatikan dalam mengamankan server
MySQL:
1. JANGAN PERNAH MEMBERI AKSES KE SEMUA USER (KECUALI USER root)
untuk dapat mengakses database mysql. Jika seseorang dapat mengakses
database ini, maka dia dapat melihat informasi user (termasuk user, password dan
host) MySQL dan (mungkin) dapat menambah atau mengubah informasi tersebut.
2. Pelajari mengenai hak akses di MySQL. Perintah GRANT dan REVOKE digunakan
untuk mengatur hak akses di MySQL. Sebisa mungkin jangan memberikan hak
akses ke MySQL pada semua host (%). Dan cobalah untuk mengecek dengan:
a) Cobalah login dengan perintah mysql -u root. Jika berhasil login ke server, maka
hal ini bisa menjadi masalah besar, karena password root masih kosong
sehingga semua user dapat mengakses server MySQL.
b) Gunakan perintah SHOW GRANTS untuk melihat semua hak akses user.
3. Jangan pernah menyimpan password dalam bentuk teks biasa di MySQL! Gunakan
fungsi enkripsi searah seperti fungsi PASSWORD() dan MD5() untuk mengenkripsi
isi password. Kita tidak dapat menjamin 100% bahwa server kita aman dari

Page 76

MySQL Database Administration

versi 1.0 (Maret) 2015

penyusup (intruder).
4. Hati-hati dalam memilih password. Pilihlah password yang mudah diingat tapi sulit
ditebak oleh orang lain. Dan juga jangan gunakan kata-kata yang ada di kamus,
gunakanlah kombinasi angka dan huruf.
5. Pasang firewall di server untuk mencegah penyusup. Hal ini dapat mencegah
setidaknya 50% dari program penyusup yang ada.
6. Jangan percaya sepenuhnya terhadap data yang dimasukkan oleh user. Akan lebih
baik jika kita menganggap bahwa semua user adalah jahat. Lakukan validasi data
sebelum dimasukkan ke database. Hal ini biasanya dapat dilakukan di dalam
bahasa pemrograman yang digunakan.
7. Hati-hati dalam mengirim atau mentransfer data lewat internet, karena mungkin ada
orang lain yang dapat membajak data tersebut.
Dalam hal pengamanan server MySQL, setidaknya ada beberapa faktor yang
mempengaruhi. Kita belum cukup jika mengamankan satu sisi (faktor) saja, tetapi harus
menyeluruh. Berikut ini beberapa faktor tersebut:
1. Server atau komputer tempat MySQL berada. Server tempat MySQL diinstall
tentunya menjadi gerbang utama bagi penyusup (intruder). Untuk ini kita harus
benar-benar memperhatikan faktor keamanan server. Kita dapat

memasang

firewall untuk membatasi akses penyusup ke server. Gunakan prinsip deny-all,


allow-some, dimana kita menutup semua lubang dan hanya membuka yang
diperlukan.
2. Server MySQL. Konfigurasi dan settingan dalam server MySQL juga sangat
mempengaruhi keamanan data MySQL. Bagaimana jadinya jika user yang tidak
berhak dapat mengakses sistem dan konfigurasi MySQL? Tentu sangat berbahaya.
3. Aplikasi (Pemrograman) yang digunakan. Aplikasi disini maksudnya adalah
pemrograman yang menggunakan atau berhubungan langsung dengan MySQL.
Sebagian besar penyusup akan memilih cara menyusup melalui aplikasi jika kedua
hal diatas tidak dapat dilakukan. Dan banyak database yang kebobolan karena
kelemahan dari sisi aplikasi. Secara sederhana kita dapat mengakses data ke
MySQL melalui konsep yang sering disebut sebagai SQLInjection.
4. User atau pengguna. User atau pengguna server MySQL juga mempengaruhi
keamanan datanya. Misalnya pemilihan password yang mudah ditebak (seperti
tanggal lahir), kecerobohan user yang lupa logout setelah menggunakan MySQL

Page 77

MySQL Database Administration

versi 1.0 (Maret) 2015

atau user yang menuliskan passwordnya di buku catatan.

Memahami Hak Akses (Privileges) di MySQL


MySQL pada dasarnya merupakan sistem database yang aman. Di MySQL kita
dapat mengatur hak akses tiap user terhadap data di database. MySQL memungkinkan
kita mengatur hak akses user sampai pada tingkat kolom. Artinya kita dapat mengatur
kolom tertentu dapat diakses oleh user siapa saja. Tentu, kita juga dapat mengatur hak
akses user terhadap tabel, dan database.
Semua pengaturan hak akses (privileges) tersimpan di database mysql yang
secara default sudah ada di sistem MySQL. Di dalam database mysql antara lain terdapat
tabel-tabel sebagai berikut:
user.
Tabel ini digunakan untuk menyimpan informasi user MySQL yang mencakup
informasi user, password dan host user, serta informasi hak akses user.
db.
Tabel ini digunakan untuk menyimpan informasi mengenai hak akses user terhadap
database.
host.
Tabel ini digunakan untuk menyimpan daftar komputer (bisa berupa alamat IP,
nama komputer, atau %) yang berhak mengakses suatu database.
tables_priv.
Tabel ini digunakan untuk menyimpan informasi mengenai hak akses user terhadap
tabel. Dengan kata lain menyimpan tabel ini dapat diakses oleh siapa dengan hak
akses apa saja.
columns_priv.
Tabel ini digunakan untuk menyimpan informasi mengenai hak akses user terhadap
kolom.
procs_priv.
Tabel ini digunakan untuk menyimpan informasi mengenai hak akses user terhadap

Page 78

MySQL Database Administration

versi 1.0 (Maret) 2015

procedure.
proc.
Tabel ini digunakan untuk menyimpan informasi mengenai daftar procedure dalam
MySQL.
func.
Tabel ini digunakan untuk menyimpan informasi mengenai function yang
didefinisikan di MySQL.

GRANT dan REVOKE di MySQL


Untuk mengatur hak akses di MySQL, pada dasarnya kita menggunakan bentuk
perintah GRANT dan REVOKE.
Berikut ini bentuk umum perintah GRANT dan REVOKE secara sederhana :
GRANT priv_type
ON {tbl_name | * | *.* | db_name.*}
TO user_name [IDENTIFIED BY 'password']
[WITH GRANT OPTION]
REVOKE priv_type
ON {tbl_name | * | *.* | db_name.*}
FROM user_name

Berikut ini pilihan untuk priv_type dalam bentuk umum perintah GRANT dan REVOKE di
atas:
ALL PRIVILEGES
ALTER
CREATE
DELETE
DROP

FILE
INDEX
INSERT
PROCESS
REFERENCES

RELOAD
SELECT
SHUTDOWN
UPDATE
USAGE

Perintah GRANT dan REVOKE dapat digunakan untuk membuat user baru

maupun

mengatur hak akses user yang sudah ada dengan hak akses (privileges ) tertentu.
Tingkatan hak akses user dapat terbagi menjadi tingkatan global (tersimpan di tabel
mysql.user), database (tersimpan di tabel mysql.host dan mysql.db), tabel (tersimpan di
tabel mysql.tables_priv) dan kolom (tersimpan di tabel mysql.columns_priv).
Setiap perubahan hak akses di MySQL, termasuk menambahkan user baru, tidak
akan berlaku sebelum diakhiri dengan perintah FLUSH PRIVILEGES.

Page 79

MySQL Database Administration

versi 1.0 (Maret) 2015

Menambahkan dan Mengatur Hak Akses User


Untuk menambahkan dan mengatur hak akses (privileges) user di MySQL, kita
dapat menggunakan 2 cara. Pertama langsung melakukan INSERT atau UPDATE ke
tabel mysql.user, dan tabel-tabel lain sesuai dengan hak aksesnya. Cara ini tidak
disarankan karena mengandung resiko terjadi kesalahan.
Cara kedua adalah dengan perintah GRANT dan REVOKE. Perintah ini mudah
dipahami dan diterapkan karena lebih sederhana. MySQL secara otomatis akan
menyimpan informasi user ke tabel sesuai dengan hak aksesnya.
Berikut ini beberapa contoh menambahkan user baru di MySQL:

Menambahkan user baru dengan nama user monty yang dapat mengakses
semua database dari komputer localhost dengan password qwerty. User ini juga
berhak menjalankan perintah GRANT untuk user lain.

GRANT ALL PRIVILEGES ON *.* TO monty@localhost


IDENTIFIED BY 'qwerty' WITH GRANT OPTION;

Menambahkan user baru dengan nama user adinda, tidak dapat mengakses
database (*.*), hanya dapat mengakses dari komputer dengan IP 192.168.1.5 dan
password qwerty.

GRANT USAGE ON *.* TO adinda@192.168.1.5


IDENTIFIED BY 'qwerty';

Menambahkan user baru dengan nama user admin, hanya dapat mengakses
database mysql, hanya dapat mengakses dari komputer localhost dan dengan
password qwerty.

GRANT ALL PRIVILEGES ON mysql.* TO admin@localhost


IDENTIFIED BY 'qwerty';

Berikut ini beberapa contoh mengatur hak akses user yang sudah ada di MySQL:

Mengubah hak akses user adinda agar dapat mengakses database penjualan.

GRANT ALL PRIVILEGES ON penjualan.* TO adinda@192.168.1.5;


FLUSH PRIVILEGES;

Mengubah hak akses user admin agar dapat CREATE di database penjualan.

Page 80

MySQL Database Administration

versi 1.0 (Maret) 2015

GRANT CREATE ON penjualan.* TO admin@localhost;


FLUSH PRIVILEGES;

Menghapus Hak Akses User


Untuk menghapus hak akses user, dapat dilakukan dengan perintah REVOKE.
Berikut ini contohnya:

Menghapus hak akses user admin terhadap database penjualan.

REVOKE CREATE ON penjualan.* FROM admin@localhost;


FLUSH PRIVILEGES;

Mengganti Password User


Untuk mengganti password suatu user di MySQL, kita tinggal menjalankan perintah
UPDATE terhadap field Password di tabel mysql.user. Password tersebut

diekripsi

dengan fungsi PASSWORD().


Berikut ini perintah SQL yang dapat digunakan untuk mengganti password user:
UPDATE user SET Password=PASSWORD(123) WHERE
User=admin AND Host=localhost;
SET PASSWORD FOR admin@localhost = PASSWORD (123);
FLUSH PRIVILEGES;

Page 81

MySQL Database Administration

versi 1.0 (Maret) 2015

Bab 8
Trigger dan Views

Triggers

Views

Trigger
Trigger digunakan untuk memanggil satu atau beberapa perintah SQL secara
otomatis sebelum atau sesudah terjadi proses INSERT, UPDATE atau DELETE dari suatu
tabel. Sebagai contoh misalnya kita ingin menyimpan id pelanggan secara otomatis ke
tabel log sebelum menghapus data di tabel pelanggan.
Triggers mulai dikenal di versi MySQL 5.0, dan di versi saat ini fungsionalitasnya
sudah bertambah. Pada versi selanjutnya (5.1) pihak pengembang MySQL berjanji akan
lebih menguatkan (menambah) fitur trigger ini.
Trigger sering digunakan, antara lain untuk:

Melakukan update data otomatis jika terjadi perubahan. Contohnya adalah dalam
sistem penjualan, jika dientri barang baru maka stock akan bertambah secara
otomatis.

Trigger dapat digunakan untuk mengimplementasikan suatu sistem log. Setiap


terjadi perubahan, secara otomatis akan menyimpan ke tabel log.

Trigger dapat digunakan untuk melakukan validasi dan verifikasi data sebelum data
tersebut disimpan

Membuat Trigger Baru


Berikut ini bentuk umum perintah untuk membuat triggers:
CREATE TRIGGER name
[BEFORE|AFTER] [INSERT|UPDATE|DELETE]
ON tablename
FOR EACH ROW statement

dimana
BEFORE | AFTER digunakan untuk menentukan kapan proses secara otomatis akan

Page 82

MySQL Database Administration

versi 1.0 (Maret) 2015

dieksekusi, sebelum atau sesudah proses.


INSERT | UPDATE | DELETE digunakan untuk menentukan event yang dijadikan
trigger untuk menjalankan perintah-perintah di dalam triggers.
Statement atau perintah dalam trigger dapat berupa satu perintah saja, dan dapat
juga beberapa perintah sekaligus. Jika terdapat beberapa perintah dalam trigger, maka
gunakan perintah BEGIN dan END untuk mengawali dan mengakhiri perintah.
Di dalam statement trigger, kita dapat mengakses record tabel sebelum atau
sesudah proses dengan menggunakan NEW dan OLD. NEW digunakan untuk mengambil
record yang akan diproses (insert atau update), sedangkan OLD digunakan untuk
mengakses record yang sudah diproses (update atau delete).
Berikut ini contoh trigger yang akan mencatat aktivitas ke tabel log setiap terjadi
proses insert ke tabel pelanggan:
DELIMITER $$
CREATE TRIGGER penjualan.before_insert BEFORE INSERT ON
penjualan.pelanggan
FOR EACH ROW BEGIN
INSERT INTO `log` (description, `datetime`, user_id)
VALUES (CONCAT('Insert data ke tabel pelanggan id_plg = ', NEW.id_pelanggan),
now(), user());
END;
$$
DELIMITER ;

Menghapus Trigger
Untuk menghapus trigger, dapat menggunakan perintah DROP TRIGGER dengan
diikuti dengan nama tabel dan nama triggernya. Berikut ini bentuk umum dan contoh
perintah untuk menghapus trigger.
DROP TRIGGER tablename.triggername;

Contoh :
DROP TRIGGER penjualan.before_insert;

Page 83

MySQL Database Administration

versi 1.0 (Maret) 2015

View
Views di MySQL mulai disediakan pada versi 5.0. Views merupakan suatu tampilan
tabel virtual. Views berisi perintah SELECT ke tabel dalam database. Views dapat
digunakan untuk mempermudah kita dalam pembuatan laporan atau tampilan database
yang diinginkan dengan cepat. Dengan kata lain, views merupakan perintah SELECT
yang disimpan, sehingga setiap saat kita membutuhkannya, kita dapat langsung
memanggilnya tanpa perlu mengetikkan perintah SELECT kembali.
Membuat dan Mendefinisikan Views
View dibuat atau didefinisikan dengan menggunakan perintah CREATE VIEW.
Bentuk umum perintah untuk membuat (mendefinisikan) view, sebagai berikut:

CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

Berikut ini contoh view untuk menampilkan data id, nama dan telepon pelanggan
dari tabel pelanggan yang diurutkan berdasarkan nama pelanggan.
CREATE VIEW `data_plg` AS (select id_pelanggan, nm_pelanggan, telepon from
`pelanggan` order by `nm_pelanggan`) ;

Dan untuk mengeksekusi perintah di atas, kita dapat memanggil dengan perintah SELECT
seperti halnya menampilkan data dari suatu tabel. Berikut ini contoh cara pemanggilan
view beserta hasil querynya.
SELECT * FROM data_plg;

+--------------+------------------+--------------+
| id_pelanggan | nm_pelanggan
| telepon
|
+--------------+------------------+--------------+
| P0004
| Ninda Budianto
| 08171231234 |
| P0003
| Winny
| 0815829221
|
| P0002
| Yoga Rimaldo
| 08571239501 |
| P0001
| Yusuf Hadiwinata | 085692019009 |
+--------------+------------------+--------------+
4 rows in set (0.01 sec)

Page 84

MySQL Database Administration

versi 1.0 (Maret) 2015

Contoh lain misalnya jika kita ingin membuat view untuk menampilkan laporan
jumlah barang dari setiap transaksi pemesanan yang dilakukan oleh pelanggan.
CREATE VIEW lap_jumlah_brg_transaksi AS
(SELECT pesan.id_pesan, pesan.tgl_pesan, pelanggan.id_pelanggan,
pelanggan.nm_pelanggan, detil_pesan.jumlah
FROM pesan, detil_pesan, pelanggan
WHERE pesan.id_pesan=detil_pesan.id_pesan AND
pelanggan.id_pelanggan=pesan.id_pelanggan
GROUP BY pesan.id_pesan) ;

Dan jika dipanggil hasilnya menjadi sebagai berikut:


SELECT * FROM lap_jumlah_brg_transaksi;

+----------+------------+--------------+------------------+--------+
| id_pesan | tgl_pesan | id_pelanggan | nm_pelanggan
| jumlah |
+----------+------------+--------------+------------------+--------+
|
1 | 2008-02-02 | P0001
| Yusuf Hadiwinata |
2 |
+----------+------------+--------------+------------------+--------+
1 row in set (0.09 sec)

Mengubah View
View yang sudah dibuat, dapat diubah dengan perintah ALTER. Bentuk umum
perintah untuk mengubah view yang sudah ada, sebagai berikut:
ALTER
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

Berikut ini contoh untuk mengubah view yang sudah ada:


ALTER VIEW `data_plg` AS
(select * from `pelanggan` order by `alamat`) ;

+--------------+------------------+-----------------+--------------+----------------------------+
| id_pelanggan | nm_pelanggan
| alamat
| telepon
| email
|
+--------------+------------------+-----------------+--------------+----------------------------+
| P0002
| Yoga Rimaldo
| Bandung
| 08571239501 | yoga@computradetech.com
|
| P0003
| Winny
| Jakarta Barat
| 0815829221
| winny@computradetech.com
|
| P0001
| Yusuf Hadiwinata | Jakarta Selatan | 085692019009 | yusuf.hadiwinata@gmail.com |
| P0004
| Ninda Budianto
| Jakarta Timur
| 08171231234 | ninda@computradetech.com
|
+--------------+------------------+-----------------+--------------+----------------------------+
4 rows in set (0.00 sec)

Page 85

MySQL Database Administration

versi 1.0 (Maret) 2015

Menghapus View
View yang sudah dibuat, dapat dihapus dengan perintah DROP. Berikut ini bentuk
umum dan contoh perintah untuk menghapus view.
DROP VIEW view_name;
Contoh :
DROP VIEW data_plg;
SELECT * FROM data_plg;
ERROR 1146 (42S02): Table 'penjualan.data_plg' doesn't exist

Page 86

MySQL Database Administration

versi 1.0 (Maret) 2015

Bab 9
Function dan Stored Procedure

Hello World!

Membuat, Mengubah dan Menghapus SP

Sintaks Dasar dalam SP

Trigger
Function dan Stored Procedure merupakan fitur utama yang paling penting di
MySQL 5. Function dan Stored Procedure merupakan suatu kumpulan perintah atau
statement yang disimpan dan dieksekusi di server database MySQL. Dengan SP (Stored
Procedure), kita dapat menyusun program sederhana berbasis sintaks SQL untuk
menjalankan fungsi tertentu. Hal ini menjadikan aplikasi yang kita buat lebih efektif dan
efisien.
Berikut ini beberapa keuntungan menggunakan Stored Procedure:

Lebih cepat. Hal ini karena kumpulan perintah query dijalankan langsung di server.
Berbeda dengan jika dijalankan secara sekuensial di bahasa pemrograman, akan
lebih lambat karena harus bolak-balik antara client dan server.

Menghilangkan duplikasi proses, pemeliharaan yang mudah. Pada dasarnya


operasi yang terjadi di suatu aplikasi terhadap database adalah sama. Secara
umum, di dalam aplikasi biasanya terdapat operasi untuk validasi data menghapus
inputan, record dan menambahkan sebagainya. record Dengan baru, SP,
mengubah mungkin kita record, dapat menghindari adanya duplikasi proses yang
kurang lebih sama, sehingga pemeliharaannya juga jadi lebih mudah.

Meningkatkan keamanan database. Dengan adanya SP, database akan lebih


aman karena aplikasi yang memanggil SP tidak perlu mengetahui isi di dalamnya.
Sebagai contoh, dalam proses menambahkan data (insert), kita membuat suatu SP
khusus. Dengan demikian, saat client atau aplikasi akan menambahkan data
(insert) maka tidak perlu tahu nama tabelnya, karena hanya cukup memanggil SP
tersebut dengan mengirimkan parameter yang diinginkan.

Page 87

MySQL Database Administration

versi 1.0 (Maret) 2015

Selanjutnya, Stored Procedure dari segi bentuk dan sifatnya terbagi menjadi 2
(dua), yaitu FUNCTION dan PROCEDURE. Perbedaan utama antara function dan
procedure adalah terletak pada nilai yang dikembalikannya (di-return). Function memiliki
suatu nilai yang dikembalikan (di-return), sedangkan procedure tidak.
Umumnya suatu procedure hanya berisi suatu kumpulan proses yang tidak
menghasilnya value, biasanya hanya menampilkan saja.
Note: terdapat istilah SP (Stored Procedure) maka yang dimaksud adalah Function dan
Procedure.

Hello World!
Sebagai contoh sederhana, kita akan membuat suatu SP yang akan menampilkan
string Hello World! di layar hasil. Berikut ini perintah query untuk membuat SP tersebut:
DELIMITER $$
CREATE PROCEDURE hello()
BEGIN
SELECT "Hello World!";
END$$
DELIMITER ;

Untuk memanggil procedure tersebut, gunakanlah CALL. Berikut ini contoh pemanggilan
procedure dan hasil tampilannya:
CALL hello();

Hasilnya sebagai berikut:


+--------------+
| Hello World! |
+--------------+
| Hello World! |
+--------------+
1 row in set (0.02 sec)

Page 88

MySQL Database Administration

versi 1.0 (Maret) 2015

Membuat, Mengubah dan Menghapus SP


Membuat SP (Stored Procedure)
Untuk membuat SP baru, berikut ini bentuk umumnya:
CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body
CREATE
[DEFINER = { user | CURRENT_USER }]
FUNCTION sp_name ([func_parameter[,...]])
RETURNS type [characteristic ...] routine_body

Contoh 1. Procedure untuk menghitung jumlah pelanggan


DELIMITER $$
CREATE PROCEDURE jumlahPelanggan()
BEGIN
SELECT COUNT(*) FROM pelanggan;
END$$
DELIMITER ;

Cara

pemanggilan

dari

procedure

diatas

adalah

dengan

menggunakan

CALL

jumlahPelanggan(). Hasilnya akan ditampilkan jumlah record dari tabel pelanggan.


Hasilnya:
+----------+
| COUNT(*) |
+----------+
|
4 |
+----------+
1 row in set (0.00 sec)

Berikut ini bentuk lain dari contoh diatas:


DELIMITER $$
CREATE PROCEDURE jumlahPelanggan2(OUT hasil INT)
BEGIN
SELECT COUNT(*) INTO hasil FROM pelanggan;
END$$
DELIMITER ;

Pada bentuk procedure yang kedua di atas (jumlahPelanggan2), kita menyimpan hasil
dari procedure ke dalam satu variabel bernama hasil yang bertipe INT. Perbedaan dari
kedua bentuk di atas adalah, pada bentuk kedua, kita dapat memanggil procedure dengan
SELECT, sedangkan pada yang pertama tidak bisa. Berikut ini contoh pemanggilan untuk
procedure yang kedua:

Page 89

MySQL Database Administration

versi 1.0 (Maret) 2015

mysql> CALL jumlahPelanggan2(@jumlah);


Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @jumlah AS `Jumlah Pelanggan`;
+------------------+
| Jumlah Pelanggan |
+------------------+
|
4 |
+------------------+
1 row in set (0.00 sec)

Contoh 2. Procedure untuk menghitung jumlah item barang yang pernah dibeli oleh satu
pelanggan.
DELIMITER $$
CREATE PROCEDURE jumlahItemBarang (pelanggan VARCHAR(5))
BEGIN
SELECT SUM(detil_pesan.jumlah)
FROM pesan, detil_pesan
WHERE pesan.id_pesan=detil_pesan.id_pesan
AND pesan.id_pelanggan=pelanggan;
END$$
DELIMITER ;

Contoh 3. Function untuk menghitung jumlah produk yang tersedia (stock) untuk satu
produk tertentu.
DELIMITER $$
CREATE FUNCTION jumlahStockBarang(produk VARCHAR(5))
RETURNS INT
BEGIN
DECLARE jumlah INT;
SELECT COUNT(*) INTO jumlah FROM produk
WHERE id_produk=produk;
RETURN jumlah;
END$$
DELIMITER ;

Untuk memanggil suatu function, kita tidak menggunakan CALL, tetapi langsung
dapat memanggil dengan SELECT. Berikut ini contoh pemanggilan untuk fungsi di atas.
SELECT jumlahStockBarang('B0001');

Mengubah SP
Untuk mengubah SP yang sudah ada, berikut ini bentuk umumnya:
ALTER {PROCEDURE | FUNCTION} sp_name [characteristic ...]

Page 90

MySQL Database Administration

versi 1.0 (Maret) 2015

Menghapus SP
Untuk menghapus SP yang sudah ada, berikut ini bentuk umumnya:
DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name

Atau
DROP PROCEDURE `penjualan`.`jumlahPelanggan`;
DROP PROCEDURE `penjualan`.`jumlahStockBarang`;

Sintaks Dasar dalam SP


SP dapat dikatakan sebagai bahasa pemrograman yang berada di dalam database.
Oleh karena itu, tentunya terdapat sintaks-sintaks tertentu berhubungan dengan SP
tersebut, misalnya bagaimana untuk mendeklarasikan variabel, penyeleksian kondisi,
perulangan dsb. Pada bagian ini akan diuraikan beberapa sintaks dasar SP yang
didukung oleh MySQL.

Variabel
Variabel digunakan untuk menyimpan suatu nilai secara temporer (sementara) di
memory. Variabel akan hilang saat sudah tidak digunakan lagi. Variabel dalam MySQL
sebelum dapat digunakan, pertama kali harus dideklarasikan terlebih dahulu. Berikut ini
bentuk umum pendeklarasian suatu variabel di MySQL:
DECLARE variable_name DATATYPE [DEFAULT value];
Contohnya:
DECLARE jumlah INT;
DECLARE kode VARCHAR(5);
DECLARE tgl_lahir DATE DEFAULT 1987-06-14;

Setelah dideklarasikan, suatu variabel dapat diisi dengan suatu nilai sesuai dengan tipe
data yang didefinisikan saat pendeklarasian. Untuk mengisikan nilai ke dalam suatu
variabel, digunakan perintah SET. Format umumnya sebagai berikut:
SET variable_name = expression|value;

Contohnya:
SET jumlah = 10;

Page 91

MySQL Database Administration

versi 1.0 (Maret) 2015

SET kode = (SELECT id_pelanggan FROM pelanggan LIMIT 1);


SET tgl_lahir = now();

Berikut ini contoh function hitungUmur() untuk menghitung umur seseorang saat ini
berdasarkan tahun kelahiran yang diberikan.
DELIMITER $$
CREATE FUNCTION hitungUmur (lahir DATE)
RETURNS INT
BEGIN
DECLARE thn_sekarang, thn_lahir INT;
SET thn_sekarang = YEAR(now());
SET thn_lahir = YEAR (lahir);
RETURN thn_sekarang - thn_lahir;
END$$
DELIMITER ;

Penyeleksian Kondisi
Dengan adanya fasilitas penyeleksian kondisi, kita dapat mengatur alur proses
yang terjadi dalam database kita. Di MySQL, penyeleksian kondisi terdiri dari IF, IF...ELSE
dan CASE. Berikut ini bentuk umum ketiga perintah tersebut:
IF kondisi THEN
perintah-jika-benar;
END IF;
IF kondisi THEN
perintah-jika-benar;
ELSE
perintah-jika-salah;
END IF;
CASE expression
WHEN value THEN
statements
[WHEN value THEN
statements ...]
[ELSE
statements]
END CASE;

Berikut ini contoh penggunaan perintah IF dalam fungsi cekPelanggan() dimana


fungsi ini memeriksa apakah pelanggan sudah pernah melakukan transaksi pemesanan
barang. Jika sudah pernah, tampilkan pesan berapa kali melakukan pemesanan, jika
belum tampilkan pesan belum pernah memesan.
DELIMITER $$
CREATE FUNCTION cekPelanggan (pelanggan varchar(5))
RETURNS VARCHAR (100)
BEGIN
DECLARE jumlah INT;
SELECT COUNT(id_pesan) INTO jumlah FROM pesan

WHERE id_pelanggan=pelanggan;

Page 92

MySQL Database Administration

versi 1.0 (Maret) 2015

IF (jumlah > 0) THEN


RETURN CONCAT("Anda sudah bertransaksi sebanyak ",
jumlah, " kali");
ELSE
RETURN "Anda belum pernah melakukan transaksi";
END IF;
END$$
DELIMITER ;

Dan berikut ini contoh penggunaan perintah CASE dalam fungsi getDiskon()
dimana fungsi ini menentukan diskon berdasarkan jumlah pesanan yang dilakukan.
DELIMITER $$
CREATE FUNCTION getDiskon(jumlah INT) RETURNS int(11)
BEGIN
DECLARE diskon INT;
CASE
WHEN (jumlah >= 100) THEN
SET diskon = 10;
WHEN (jumlah >= 50 AND jumlah < 100) THEN
SET diskon = 5;
WHEN (jumlah >= 20 AND jumlah < 50) THEN
SET diskon = 3;
ELSE SET diskon = 0;
END CASE;
RETURN diskon;
END$$
DELIMITER ;

Perulangan
Selain penyeleksian kondisi, MySQL juga mendukung adanya perulangan dalam
querynya. Perulangan biasanya digunakan untuk mengulang proses atau perintah yang
sama. Dengan perulangan, perintah akan lebih efisien dan singkat. Berikut ini bentukbentuk perintah perulangan:
[label:] LOOP
statements
END LOOP [label];
[label:] REPEAT
statements
UNTIL expression
END REPEAT [label]
[label:] WHILE expression DO
statements
END WHILE [label]

Page 93

MySQL Database Administration

versi 1.0 (Maret) 2015

Contoh perulangan dengan LOOP


SET i=1;
ulang: WHILE i<=10 DO
IF MOD(i,2)<>0 THEN
SELECT CONCAT(i," adalah bilangan ganjil");
END IF;
SET i=i+1;
END WHILE ulang;

Page 94

MySQL Database Administration

versi 1.0 (Maret) 2015

Bagian 4

LAPORAN DAN BACKUP DI MySQL

Page 95

MySQL Database Administration

versi 1.0 (Maret) 2015

Bab 10
Laporan di MySQL

Laporan dari Tabel dan Query

Format Laporan

Pengenalan Database, DBMS dan RDBMS


Laporan biasanya disajikan dalam berbagai bentuk (format file). Umumnya bentuk
laporan dapat berupa file Excel, PDF, HTML, XML, dsb. Pembuatan laporan di MySQL
akan lebih mudah jika kita menggunakan software bantuan. Di sini akan disampaikan
bagaimana membuat laporan dengan menggunakan software SQL Front.
Laporan dari database umumnya didasarkan pada hasil (results) suatu perintah
query SELECT. Dengan SELECT kita dapat menyeleksi tampilan atau hasil yang
diinginkan dari tabel-tabel yang ada di database. SELECT dapat berupa seleksi ke satu
tabel atau beberapa tabel sekaligus (join antar tabel).

Laporan dari Tabel dan Query


Dengan menggunakan MySQL Front, kita dapat membuat laporan dari tabel (tabledata) dan juga dari hasil query (results). Laporan dari tabel merupakan laporan yang
menampilkan seluruh data dari suatu tabel, sedangkan laporan dari query merupakan
laporan yang menampilkan seluruh data dari hasil suatu perintah query.

Laporan dari Tabel


1. Pilih tabel yang akan dibuat laporan. lalu Pilih klik kanan pada table Table > Export
> Export Table Data As CSV, SQL, Excel, etc.

Page 96

MySQL Database Administration

versi 1.0 (Maret) 2015

2. Pilih format laporan dan tempat menyimpan hasil laporan dan tentukan nama file
3. Masukan properties dari proses export dan klik Run

4. Buka File hasil laporan.

Page 97

MySQL Database Administration

versi 1.0 (Maret) 2015

Format Laporan
Format file laporan yang dapat di-generate secara langsung dengan MySQL Front
diantaranya file CSV, HTML, XML, Excel XML, dan SQL.
CSV
CSV merupakan singkatan dari Comma Separated Version. CSV merupakan suatu
format data dimana setiap record dipisahkan dengan koma (,) atau titik koma (;). Selain
sederhana, format ini dapat dibuka dengan berbagai text-editor seperti Notepad, Word,
bahkan MS Excel. Berikut ini pilihan untuk membuat report dalam CSV.

Page 98

MySQL Database Administration

versi 1.0 (Maret) 2015

Bab 11
Backup, Restore dan Import di MySQL

Backup

Restore

Import

Backup
Proses backup data merupakan hal yang sangat penting dilakukan. Hal ini
diperlukan untuk mengantisipasi hal-hal yang tidak diinginkan di database kita, misalnya
hilangnya data, rusaknya database dsb. Sebaiknya proses backup dilakukan secara rutin
dan terus-menerus.
Backup di MySQL sebenarnya ada 2 jenis, yaitu secara otomatis dan manual.
Secara otomatis kita dapat menggunakan konsep replication , dimana server database
kita secara real-time di-backup dengan server lain. Jika terdapat perubahan di server
utama kita, maka secara otomatis perubahannya akan di- replikasi ke server kedua. Selain
itu, kita juga dapat melakukan backup otomatis dengan bantuan software tertentu.
Biasanya kita dapat membuat schedule- backup. Backup akan dijalankan oleh software
secara otomatis setiap periode waktu tertentu.
Jenis kedua, kita dapat melakukan backup secara manual. Backup manual
dilakukan oleh database administrator dengan menjalankan perintah-perintah tertentu.
Backup manual ada dua bentuk, yaitu backup dalam bentuk file database dan backup
dalam bentuk perintah database.
Backup Bentuk File
Backup dalam bentuk file disini maksudnya adalah melakukan backup MySQL
dengan meng-copy folder tempat database MySQL disimpan. Jika kita menggunakan
sistem operasi Windows dan MySQL 5.x, secara default database MySQL tersimpan
didalam folder C:\Program Files\MySQL\MySQL Server 5.0\data. Kita hanya tinggal mengcopy database yang akan kita backup dari folder tersebut ke tempat lain.
Keuntungan dari cara backup seperti ini adalah kemudahannya terutama bagi yang
awam dengan database, karena tinggal copy dan paste. Namun cara seperti ini terkadang
bermasalah saat melakukan restore jika menggunakan sistem operasi yang berbeda.

Page 99

MySQL Database Administration

versi 1.0 (Maret) 2015

Backup Bentuk Perintah Database


Backup dalam bentuk perintah database sering disebut sebagai backup dalam
bentuk SQL Dump. SQL Dump merupakan suatu format (file) yang berisi perintah-perintah
CREATE dan INSERT yang jika dieksekusi akan menyusun struktur database dan isinya
secara otomatis.
Pada dasarnya, bentuk SQL Dump dapat dilakukan dengan mengeksekusi perintah
mysqldump atau mysqlhotcopy yang sudah disediakan di MySQL. Bentuk umum dari
kedua perintah tersebut adalah:
shell> mysqldump --tab=/path/to/some/dir --opt db_name
shell> mysqlhotcopy db_name /path/to/some/dir

Contoh misalnya kita akan melakukan backup semua database, sintaksnya sebagai
berikut:
shell > mysqldump --all-databases > backup-semua-db.sql

Jika ingin membakup salah satu database saja bisa menggunakan perintah seperti
dibawah ini:
shell > mysqldump penjualan > backup-penjualan-db.sql

Selain dengan cara perintah manual, kita juga dapat memanfaatkan software lain
seperti MySQL Front. Berikut ini prosedur atau cara backup dengan memanfaatkan
MySQL Front.
1. Silahkan jalankan MySQL Front dari shorcut atau Startmenu, lalu pilih database
server yang akan di backup seperti gambar dibawah ini:

Page 100

MySQL Database Administration

versi 1.0 (Maret) 2015

2. Pilih database yang akan di backup dan klik kanan pada database tersebut, pilih
export sebagai SQL File lalu Run

3. Hasil dari file backup database dapat di edit menggunakan text editor seperti
notepad atau wordpad jika diperlukan.

Page 101

MySQL Database Administration

versi 1.0 (Maret) 2015

Restore
Restore merupakan prosedur yang dilaksanakan untuk mengembalikan file yang
dibackup ke database MySQL. Proses restore juga dapat dilakukan melalui perintah SQL
dengan memanfaatkan mysql dan juga bisa menggunakan software bantuan.
Jika menggunakan sintaks SQL, berikut ini contoh perintahnya:
shell > mysql u user p < backup-semua-db.sql

Untuk merestore single database backup bisa menggunakan format dibawah ini:
shell > mysql -u user p penjualan < backup-penjualan-db.sql

Sedangkan jika menggunakan MySQL Front, berikut ini prosedur restore databasenya:
1. Pilih nama database yang akan di restore/replace isinya, lalu klik kanan pada
database tersebut dan pilih import, lanjutkan dengan mengklik Import from SQL File
seperti gambar dibawah ini:

2. Lanjut dengan mengarahkan ke database file hasil backup sebelumnya

Page 102

MySQL Database Administration

versi 1.0 (Maret) 2015

3. Berikut tampilan dari proses restore database

Import
Adakalanya kita mempunyai data mentah dalam jumlah besar. Data dapat dalam
bentuk Excel, CVS, SQL, atau yang lainnya. Dan jika kita ingin meng-import data tersebut,
kita harus menyesuaikan format data tersebut ke format yang dikenal oleh MySQL
Jika data dalam format .SQL maka prosedur untuk import dapat mengikuti prosedur
restore diatas. Berikut ini contoh prosedur import untuk format data CVS. Untuk format
data yang lain, harus disesuaikan dengan format CVS.
1. Jika sebelumnya kita mempunya data mentah yang berbentuk CSV ingin kita
tambahkan pada database server, prosedur import dapat digunakan untuk
kebutuhan seperti itu, berikut adalah contoh data yang akan di import
Berikut contoh isi dari table pelanggan dari database penjualan:

Page 103

MySQL Database Administration

versi 1.0 (Maret) 2015

2. Dan berikut contoh dari File CSV yang akan kita import ke dalam database
penjualan table pelanggan

3. Proses Import CSV file menggunakan PhpMyAdmin adalah dengan cara mengklik
nama database dan dilanjutkan dengan megklik nama table pada menu kiri
PhpMyAdmin, setelah isi table yang ingin di import terlihat dapat melanjutkan
dengna megnklik Tab Import seperti gambar dibawah ini:

4. Klik Browser lalu arahkan ke file yang akan di import seperti gambar di bawah ini,
selanjutnya klik tombol Go yang berlokasi di pojok kanan bawah

Page 104

MySQL Database Administration

versi 1.0 (Maret) 2015

5. Hasil dari Import data CSV dapat kita lihat pada table pelanggan

Page 105

MySQL Database Administration

versi 1.0 (Maret) 2015

Bagian 5

MySQL METADATA

Page 106

MySQL Database Administration

versi 1.0 (Maret) 2015

Bab 12
Memanfaatkan MySQL Metadata

Pengenalan MySQL Metadata

Penggunaan PHP dan Perl

MySQL Metadata
Pada aplikasi MySQL terdapat tiga macam data atau informasi yang dapat

di

gunakan, masing-masing data mempunyai fungsi tersendiri, berikut adalah pembagian


dari ketiga Metadata tersebut:
1. Informasi mengenai hasil dari Query: Termasuk banyaknya record yang
dikeluarkan dari Perintah SQL: SELECT, UPDATE or DELETE.
2. Informasi mengenai table-table dan database: Informasi tersebut termasuk
informasi yang berkaitan dengan struktur tabel dan database.
3. Informasi tentang server MySQL: Ini termasuk status database server,

versi

database dll.
Untuk mendapatkan informasi diatas menggunakan MySQL prompt ataupun
menggunakan MySQL Front sangatlah mudah, untuk kali kita akan menggunakan PERL
dan PHP Script untuk mengeluarkan informasi diatas.

Penggunaan PHP Script


PHP menjadi bahasa pemrogaman yang cukup populer dalam hal integrasi dengan
database MySQL, lebih dari 70% web aplikasi yang berbasis PHP menggunakan MySQL
sebagai solusi database aplikasinya. Untuk itu sangat baik sekali mempelajari bagaimana
PHP Script dapat menampilkan dan menggunakan MySQL sebagai basis penyimpanan
dan penampilan data.
PHP membutuhkan modul PHP-MySQL terinstall sebagai jembatan antara
database MySQL dengan PHP, module tersebut merupakan Core Module dari PHP dan
dengan mudah dapat di install.

Page 107

MySQL Database Administration

versi 1.0 (Maret) 2015

Ada dua buah jenis koneksi dari script PHP ke MySQL yaitu menggunakan MySQLi
dan PDO. Kedua jenis koneksi tersebut mempunyai keuntungan tersendiri dimana PDO
dapat bekerja pada 12 macam database systems dan MySQLi hanya bekerja untuk
MySQL databases sehingga PDO akan memudahkan kita berpindah progam database.

Open dan Close Koneksi PHP ke MySQL


Membuat koneksi ke MySQL dari script PHP dengan model MySQLi Object-Oriented
<?php
$servername = "localhost"; //domain atau ip dari mysql server
$username = "username"; // nama user mysql
$password = "password"; // password user myslq
// Membuat koneksi
$conn = new mysqli($servername, $username, $password);
// Mengecheck koneksi
if ($conn->connect_error) {
die("Koneksi Gagal: " . $conn->connect_error);
}
echo "Koneksi Sukses";
?>

Jika pada bagian username dan password kita salah memasukan informasinya, maka
pada saat php script tersebut di jalankan akan menghasilkan seperti gambar di bawah ini:

Dan jika berhasil, Outputnya adalah:


Koneksi Sukses

Contoh (MySQLi Procedural)


Sebagai pengganti mysql extension, PHP menyediakan mysqli extension (mysqli
merupakan singkatan dari MySQL Improved). Mysqli extension ini pada dasarnya adalah
perbaikan dari mysql extension dan dikembangkan untuk mendukung fitur-fitur terbaru
untuk MySQL 4.1 keatas.
Hampir semua fungsi yang ada pada mysql extension juga tersedia pada mysqli.
Syntax (aturan penulisan) mysqli sangat mirip dengan mysql extension. Sehingga jika
telah lama menggunakan mysql extension, akan sangat mudah untuk beralih
menggunakan mysqli extension.

Page 108

MySQL Database Administration

versi 1.0 (Maret) 2015

<?php
$servername = "localhost";
$username = "username";
$password = "password";
// Membuat koneksi
$conn = mysqli_connect($servername, $username, $password);
// Mengecheck koneksi
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
?>

Contoh PHP Sript menggunakan koneksi PDO


PDO (PHP Data Objects), adalah extension atau penambahan fitur dalam PHP
yang dirancang sebagai interface universal untuk pengaksesan berbagai jenis database
(tidak hanya MySQL). Contohnya, jika kita menggunakan PDO dalam menulis kode
pemograman, lalu suatu saat website kita bertukar database dari MySQL ke Oracle, maka
kita tidak perlu mengubah semua kode program, cukup mengubah cara pemanggilan PDO
diawal program saja.
Dari ketiga cara koneksi PHP dengan MySQL ini, metode yang disarankan adalah
menggunakan mysqli atau PDO.
<?php
$servername = "localhost";
$username = "username";
$password = "password";
try {

$conn = new PDO("mysql:host=$servername;dbname=myDB", $username,


$password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully";
}
catch(PDOException $e)
{
echo "Connection failed: " . $e->getMessage();
}
?>

Note: pada contoh php script model object-oriented diatas: fungsi $connect_error sudah
ditiadakan sampai dengan versi PHP 5.2.9 and 5.3.0. PHP memutuskan untuk membuat
mysql extension berstatus deprecated. Yang artinya pengaksesan database MySQL
menggunakan fungsi mysql extension sudah tidak disarankan lagi. Programmer PHP
diharapkan pindah ke mysqli extension atau PDO yang berbasis objek. sebagai gantinya

Page 109

MySQL Database Administration

versi 1.0 (Maret) 2015

bisa menggunakan fungsi dibawah ini.


Alasannya, MySQL versi terbaru memiliki fitur-fitur yang semakin lengkap dan
kompleks, sehingga PHP memutuskan untuk membuat fungsi extension baru agar
programmer PHP bisa menggunakan fitur-fitur ini.
// Mengecheck koneksi.
if (mysqli_connect_error()) {
die("Database connection failed: " . mysqli_connect_error());
}

Koneksi ke database MySQL akan otomatis terputus pada akhir dari script PHP. Untuk
memutus koneksi sebelum berakhirnya script bisa menggunakan fungsi dibawah ini
$conn->close();

Perbandingan antara mysqli, PDO dan mysql extension


Sebagai perbandingan fitur antara ketiga jenis koneksi PHP-MySQL ini, berikut
adalah tabel perbandingan antara mysqli, PDO dan mysql extension yang bersumber dari
manual resmi PHP:

Menyajikan Data MySQL dengan Tabel HTML dan CSS


Umumnya, hasil query MySQL yang kita ambil dari database akan ditampilkan ke
dalam bentuk tabel. Dengan mengkombinasikan PHP, MySQL, HTML dan CSS, kita bisa
menampilkan data tabel MySQL dengan desain yang beragam. Dalam tutorial PHP

Page 110

MySQL Database Administration

versi 1.0 (Maret) 2015

MySQL ini, saya akan mencoba menampilkan tabel mahasiswa_ilkom dengan tampilan
akhir seperti gambar berikut:

Tampilan diatas di dapat dengan mengkombinasikan PHP, MySQL, HTML dan CSS. Dan
berikut adalah kode program yang digunakan:
<?php
//buat koneksi dengan MySQL
$link=mysql_connect('localhost','root','password');
//jika koneksi gagal, langsung keluar dari PHP
if (!$link)
{
die("Koneksi dengan MySQL gagal");
}
//gunakan database penjualan
$result=mysql_query('USE penjualan');
if (!$result)
{
die("Database penjualan gagal digunakan");
}
//tampilkan tabel pelanggan
$result=mysql_query('SELECT * FROM pelanggan');
?>
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>Belajar PHP MySQL</title>
<style>
h3{
text-align:center; }
table {
border-collapse:collapse;
border-spacing:0;
font-family:Arial, sans-serif;
font-size:16px;
padding-left:300px;
margin:auto; }
table th {
font-weight:bold;
padding:10px;
color:#fff;
background-color:#2A72BA;
border-top:1px black solid;
border-bottom:1px black solid;}
table td {
padding:10px;
border-top:1px black solid;
border-bottom:1px black solid;
text-align:center; }
tr:nth-child(even) {
background-color: #DFEBF8; }

Page 111

MySQL Database Administration

versi 1.0 (Maret) 2015

</style>
</head>
<body>
<h3>Penyajian Data MySQL dalam bentuk tabel HTML dengan CSS</h3>
<table>
<tr>
<th>ID</th>
<th>Nama</th>
<th>Alamat</th>
<th>Telepon</th>
<th>Email</th>
</tr>
<?php
while ($row=mysql_fetch_array($result))
{
echo "<tr>";
echo "<td>".$row['id_pelanggan']."</td>";
echo "<td>".$row['nm_pelanggan']."</td>";
echo "<td>".$row['alamat']."</td>";
echo "<td>".$row['telepon']."</td>";
echo "<td>".$row['email']."</td>";
echo "</tr>";
}
?>
</table>
</body>
</html>

Membuat CRUD (Create, Read, Update, Delete) data dengan PHP


untuk membuat form edit data, tidak jauh berbeda dengan membuat read. yang
membeda kan nya hanya saja pada input kita menggunakan value untuk mengambil dari
data mahasiswa yang ingin di edit. tentunya menggunakan method GET juga, di sini lah
letak penting nya kita membuat id_pelanggan, karena akan memudahkan kita untuk
memilih data mahasiswa yang mana yang akan di olah. dan penting nya primary key dan
auto increment, agar id_pelanggan tidak ada yang sama .
Pertama-tama buat sebuah file php dengan nama lihat_mhs.php untuk menampilkan
pelanggan dan mengelola pelanggan:
<html>
<head>
<?php
include 'config.php'; // hubungkan file php dengan file configurasi ke database
?>
</head>
<body>
<h1>Data Pelanggan</h1>
<table border="1">
<tr>
<th>No</th>
<th>ID</th>
<th>Nama</th>
<th>Alamat</th>
<th>Telepon</th>
<th>Email</th>
<th>opsi</th>
</tr>
<?php
$query=mysql_query("select * from pelanggan");
//mengambil
pelanggan dan memasukkan nya ke variabel query
$no=1;
//membuat nomor pada tabel

Page 112

data

tabel

MySQL Database Administration

versi 1.0 (Maret) 2015

while($lihat=mysql_fetch_array($query)){
//mengeluarkan isi data
dengan mysql_fetch_array dengan perulangan
?>
<tr>
<td><?php echo $no++; ?></td> <!--menampilkan nomor dari variabel no-->
<td><?php echo $lihat['id_pelanggan'] ?></td>
<!-- menampilkan data ID Pelanggan dari tabel pelanggan-->
<td><?php echo $lihat['nm_pelanggan'] ?></td>
<!--menampilkan data nama dari tabel pelanggan-->
<td><?php echo $lihat['alamat'] ?></td>
<!-- menampilkan data jurusan dari tabel pelanggan-->
<td><?php echo $lihat['telepon'] ?></td>
<!--menampilkan data alamat dari tabel pelanggan-->
<td><?php echo $lihat['email'] ?></td>
<!--menampilkan data jenis kelamin dari tabel pelanggan-->
<td><a href="edit_mhs.php?id_pelanggan=<?php echo $lihat['id_pelanggan'] ?>">Edit</a> ||
<!--membuat link ke file dan hapus.php-->
<a href="hapus_mhs.php?id_pelanggan=<?php echo $lihat['id_pelanggan'] ?>">Hapus</a></td>
<!--membuat link ke file dan hapus.php-->
</tr>
<?php
}
?>
</table>
<br/>
<a href="tambah_mhs.php">Tambah Pelanggan</a>
<!--membuat link untuk di hubungakan ke file tambah pelanggan-->
</body>
</html>

Isi dari config.php yang digunakan sebagai koneksi database:


<?php
mysql_connect("localhost","root",'password');
//sesuaikan username dan password nya sesuai dengan host teman-teman
mysql_select_db("penjualan");
//sesuai dengan nama database yang kita buat dan yg akan kita gunakan
?>

Tampilah dari lihat_mhs.php jika dipanggil browser

Selanjutnya dilajutkan dengan membuat file tambah_mhs.php dan tambah_aksi.php yang


digunakan untuk menambahkan pelanggan, berikut isi dari kedua file tersebut
<html>
<head>
<?php
include 'config.php'; // hubungkan file php dengan file configurasi ke database
?>

Page 113

MySQL Database Administration

versi 1.0 (Maret) 2015

</head>
<body>
<h1>Data Pelanggan</h1>
<table border="1">
<tr>
<th>No</th>
<th>ID</th>
<th>Nama</th>
<th>Alamat</th>
<th>Telepon</th>
<th>Email</th>
<th>opsi</th>
</tr>
<?php
$query=mysql_query("select * from pelanggan");
//mengambil data tabel pelanggan dan memasukkan nya ke variabel query
$no=1;
//membuat nomor pada tabel
while($lihat=mysql_fetch_array($query)){
//mengeluarkan isi data dengan mysql_fetch_array dengan perulangan
?>
<tr>
<td><?php echo $no++; ?></td>
<!--menampilkan nomor dari variabel no-->
<td><?php echo $lihat['id_pelanggan'] ?></td>
<!-- menampilkan data ID Pelanggan dari tabel pelanggan-->
<td><?php echo $lihat['nm_pelanggan'] ?></td>
<!--menampilkan data nama dari tabel pelanggan-->
<td><?php echo $lihat['alamat'] ?></td>
<!-- menampilkan data jurusan dari tabel pelanggan-->
<td><?php echo $lihat['telepon'] ?></td>
<!--menampilkan data alamat dari tabel pelanggan-->
<td><?php echo $lihat['email'] ?></td>
<!--menampilkan data jenis kelamin dari tabel pelanggan-->
<td><a href="edit_mhs.php?id_pelanggan=<?php echo $lihat['id_pelanggan'] ?>">Edit</a> ||
<!--membuat link ke file dan hapus.php-->
<a href="hapus_mhs.php?id_pelanggan=<?php echo $lihat['id_pelanggan'] ?>">Hapus</a></td>
<!--membuat link ke file dan hapus.php-->
</tr>
<?php
}
?>
</table>
<br/>
<a href="tambah_mhs.php">Tambah Pelanggan</a>
<!--membuat link untuk di hubungakan ke file tambah pelanggan-->
</body>
</html>

<?php
include 'config.php';
$id_pelanggan = $_POST['id_pelanggan'];
$nama = $_POST['nama'];
$alamat = $_POST['alamat'];
$telepon = $_POST['telepon'];
$email = $_POST['email'];
$input = mysql_query("insert into pelanggan values
('$id_pelanggan','$nama','$alamat','$telepon','$email')");
if ($input) {
header("location:lihat_mhs.php");
} else {
echo "gagal";
}
?>

Page 114

MySQL Database Administration

versi 1.0 (Maret) 2015

Berikut tampilah dari tambah_mhs.php pada saat diakses

Sejauh ini sudah bisa melist (SELECT) dan menambahkan pelanggan baru (INSERT),
selanjutnya dilanjutkan dengan membuat script PHP untuk edit (UPDATE) dan hapus
pelanggang (DELETE).
Berikut adalah isi dari file yang digunakan untuk merubah informasi dari suatu pelanggan
Berikut isi dari file edit_mhs.php dan update.php
<h1>Edit data pelanggan</h1>
<?php
include './config.php';
$id_pelanggan = $_GET['id_pelanggan'];
$query = mysql_query("select * from pelanggan where id_pelanggan='$id_pelanggan'");
while ($q = mysql_fetch_array($query)) {
?>
<table>
<form action="update.php?id_pelanggan=<?php echo $q['id_pelanggan'];?>" method="post">
<tr>
<td>Nama</td>
<td><input type="text" value="<?php echo $q['nm_pelanggan'] ?>" name="nama"></td>
</tr>
<tr>
<td>Alamat</td>
<td><input type="text" name="alamat" value="<?php echo $q['alamat'] ?>"></td>
</tr>
<tr>
<td>Telepon</td>
<td><input type="text" name="telepon" value="<?php echo $q['telepon'] ?>"></td>
</tr>
<tr>
<td>Email</td>
<td><input type="text" name="email" value="<?php echo $q['email'] ?>"></td>
</tr>
<tr>
<tr>
<td></td><td><input type="submit" value="update"></td> </br>
</tr>
<?php echo $q['id_pelanggan'];?>

}
?>

</form>
</table>
<?php

Page 115

MySQL Database Administration

versi 1.0 (Maret) 2015

update.php
<?php
include './config.php';
$id = $_GET['id_pelanggan'];
$nama = $_POST['nama'];
$alamat = $_POST['alamat'];
$telepon = $_POST['telepon'];
$email = $_POST['email'];
$update = mysql_query("update pelanggan set nm_pelanggan='$nama', alamat='$alamat',
telepon='$telepon', email='$email' where id_pelanggan like '$id'");
if ($update) {
header("location:lihat_mhs.php");
} else {
echo "gagal mengupdate data";
}
?>

Berikut tampilan dari page update

pada form kita memilih file update.php untuk melakukan aksi atau pengolahan dari form
edit ini. oleh karena itu kita harus membuat file update.php dulu, agar data yang di edit
dapat di olah pada database update.php.
Bagian terakhir adalah membuat fungsi delete menggunakan PHP, silahkan buat file
hapus_mhs.php dengan isi seperti di bawah ini:
<?php
include 'config.php';
$id = $_GET['id_pelanggan'];
$hps = mysql_query("delete from pelanggan where id_pelanggan='$id'");
if ($hps) {
header("location:lihat_mhs.php");
} else {
echo "gagal menghapus";
}
?>

Page 116

MySQL Database Administration

versi 1.0 (Maret) 2015

Open Koneksi PERL ke MySQL


Perl DBI (Database Interface) adalah akses modul database untuk bahasa
pemrograman Perl. Yang mendefinisikan seperangkat metode, variabel dan konvensi yang
menyediakan

antarmuka

pembebanan

dinamis

database

driver,

standar.

pengecekan

DBI
error

juga

bertanggung

jawab

atas

dan

penanganan,

memberikan

implementasi untuk metode default, dan banyak tugas-tugas khusus non-database lain.
Sebelum kita dapat menggunakan DBI, untuk mengetahui Driver apa saja yang
terinstall dapat menggunakan perl script seperti ini:
#!/usr/bin/perl
use strict;
use DBI;
my @ary = DBI->available_drivers();
print join("\n", @ary), "\n";

Lalu eksekusi perl script tersebut dengan perintah:


perl nama-script.extension

Contoh outputnya:
DBM
ExampleP
File
Gofer
Proxy
Sponge
mysql

Berikut contoh lengkap dari PERL Script koneksi ke MySQL


#!/usr/bin/perl
use strict;
use warnings;
use DBI;
# Konek ke database.
my $dbh = DBI->connect("DBI:mysql:database=test;host=localhost",
"joe", "password",
{'RaiseError' => 1});
# Drop table 'foo'. Akan gagal, jika tabel 'foo' sudah ada
eval { $dbh->do("DROP TABLE foo") };
print "Gagal drop table foo: $@\n" if $@;
# Test membuat table foo
$dbh->do("CREATE TABLE foo (id INTEGER, name VARCHAR(20))");
# INSERT contoh data kedalam table 'foo' menggunakan fungsi $dbh->quote()
# untuk quoting nama.
$dbh->do("INSERT INTO foo VALUES (1, " . $dbh->quote("Yusuf") . ")");

Page 117

MySQL Database Administration

versi 1.0 (Maret) 2015

# Inser contoh data menggunakan metode placeholders (direkomendasikan!)


$dbh->do("INSERT INTO foo VALUES (?, ?)", undef, 2, "Hadiwinata");
# Mengeluarkan data yang telah di input sebelumnya
my $sth = $dbh->prepare("SELECT * FROM foo");
$sth->execute();
while (my $ref = $sth->fetchrow_hashref()) {
print "Menemukan Row: id = $ref->{'id'}, name = $ref->{'name'}\n";
}
$sth->finish();
# Memutuskan koneksi database.
$dbh->disconnect();

agar dapat menggunakan interpreter DBI, kita harus meninstall DBI Per module, perintah
yang dapat digunakan untuk menginstall Perl DBI module adalah:
# perl -MCPAN -e shell
cpan[]> install DBI

Page 118

MySQL Database Administration

versi 1.0 (Maret) 2015

Bagian 6

STORAGE ENGINE

Page 119

MySQL Database Administration

versi 1.0 (Maret) 2015

Bab 13
MySQL Storage Engine

Pengenalan Storage engine

Perbedaan tiap Storage engine

Pembahasan penggunaan Storage engine

Pengenalan Database, DBMS dan RDBMS


Secara default, MySQL telah dilengkapi dengan sejumlah storage engine yang
telah diprakonfigurasi dan diaktifkan di server MySQL. Dua storage engine MySQL yang
paling umum digunakan adalah InnoDB dan MyISAM. InnoDB adalah storage engine
default untuk MySQL versi 5.5 ke atas, sedangkan MyISAM adalah storage engine yang
digunakan sebelum MySQL versi 5.5. Student dapat memilih storage engine yang dapat
digunakan pada server, database maupun tabel. Jika tidak menentukan storage engine
yang akan digunakan, storage engine default yang digunakan adalah yang sesuai dengan
konfigurasi server MySQL. Berikut ini adalah berapa storage engine yang ada di MySQL
versi 5.5:
1. InnoDB : merupakan storage engine yang aman untuk proses-proses transaksional
pada MySQL yang memiliki kemampuan commit, rollback dan crash-recovery guna
memproteksi data penguna. InnoDB menyimpan data pengguna dalam indeksindeks yang terklaster (clustered indexes) untuk mengurangi I/O atas kueri umum
(common queries) berdasarkan primary key. Guna mendukung integritas data,
InnoDB juga mendukung Foreign Key untuk referential-integrity constraint. InnoDB
adalah storage engine default untuk MySQL versi 5.5 ke atas.
2. MyISAM : merupakan storage engine default untuk MySQL sebelum versi 5.5 dan
yang paling panyak digunakan pada data werehousing, Web dan lingkungan
aplikasi lainnya. Beberapa contoh CMS (Content Management System) terkenal
yang telah menggunakan MySQL diantaranya adalah Joomla, Wordpress dan
Drupal.
3. Memory : merupakan storage engine yang menyimpan data di RAM untuk akses
cepat terhadap pencarian data. Storage engine yang awalnya dikenal sebagai
HEAP engine ini pemanfaatannya cenderung mengalami penurunan.
4. CSV : mulai ditambahkan di MySQL versi 4.1.4, merupakan storage engine yang

Page 120

MySQL Database Administration

versi 1.0 (Maret) 2015

menyimpan data dalam bentuk file text dan menggunakan pembatas koma untuk
memisahkan format nilai. Student dapat menggunakannya untuk bertukar data
antar perangkat lunak yang mendukung format CSV.
5. Merge : merupakan storage engine yang memudahkan Administrator Database
MySQL untuk mengelompokkan secara logis serangkaian tabel MyISAM yang
identik dan mengacunya sebagai satu obyek.
6. Archive : mulai ditambahkan di MySQL versi 4.1.3, merupakan storage engine
yang digunakan untuk menyimpan atau memperoleh informasi dalam jumlah cukup
besar dari tabel-tabel yang tidak terindeks.
7. Blackhole : merupakan storage engine yang menerima tetapi tidak menyimpan
data dan proses pengambilan data selalu tidak menghasilkan apapun (an empty
set), digunakan dalam desain database terdistribusi dimana data otomatis
direplikasi tetapi tidak disimpan.
8. Federated : mulai ditambahkan di MySQL versi 5.0, merupakan storage engine
yang menawarkan kemampuan untuk menghubungkan server MySQL yang
terpisah untuk membuat satu database logis dari banyak server fisik.
9. Example : merupakan storage engine yang berfungsi sebagai rintisan yang tidak
melakukan apapun dan berfungsi sebagai contoh dalam kode sumber MySQL.
Student dapat membuat tabel menggunakan storage engine ini, tetapi tidak dapat
digunakan untuk menyimpan ataupun mengambil data.
Komparasi antar Storage Engine:
Feature

MyISAM

Memory

InnoDB

Archive

NDB

Storage limits
Transactions
Locking granularity
MVCC
Geospatial data type support
Geospatial indexing support
B-tree indexes
T-tree indexes
Hash indexes
Full-text search indexes
Clustered indexes
Data caches
Index caches
Compressed data
Encrypted data
Cluster database support
Replication support
Foreign key support
Backup / point-in-time recovery
Query cache support
Update statistics for data dictionary

256TB
No
Table
No
Yes
Yes
Yes
No
No
Yes
No
No
Yes
Yes
Yes
No
Yes
No
Yes
Yes
Yes

RAM
No
Table
No
No
No
Yes
No
Yes
No
No
N/A
N/A
No
Yes
No
Yes
No
Yes
Yes
Yes

64TB
Yes
Row
Yes
Yes
Yes
Yes
No
No
Yes
Yes
Yes
Yes
Yes
Yes
No
Yes
Yes
Yes
Yes
Yes

None
No
Table
No
Yes
No
No
No
No
No
No
No
No
Yes
Yes
No
Yes
No
Yes
Yes
Yes

384EB
Yes
Row
No
Yes
No
No
Yes
Yes
No
No
Yes
Yes
No
Yes
Yes
Yes
No
Yes
Yes
Yes

Page 121

MySQL Database Administration

versi 1.0 (Maret) 2015

Penggunaan Storage Engine


Untuk Menampilkan Storage engine apa saja yang dapat digunakan pada instalasi
MySQL server kita dapat menggunakan perintah

SHOW ENGINES; .

Perintah tersebut akan

menampilkan status dan keterangan dari Storage engine MySQL yang terinstall.
Berikut keluaran dari perintah tersebut
*************************** 1. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 2. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 6. row ***************************
Engine: FEDERATED
Support: NO
Comment: Federated MySQL storage engine
Transactions: NULL
XA: NULL
Savepoints: NULL
*************************** 7. row ***************************
Engine: ARCHIVE
Support: YES
Comment: Archive storage engine
Transactions: NO
XA: NO
Savepoints: NO

Page 122

MySQL Database Administration

versi 1.0 (Maret) 2015

*************************** 8. row ***************************


Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
*************************** 9. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
9 rows in set (0.00 sec)

Melakukan pengaturan mode Storage engine


Pada CREATE TABLE STATEMENT kita dapat menambahkan ENGINE table option untuk
menggunakan mode storage engine. Berikut dibawah ini beberapa contoh pembuatan
table dan melakukan konfigurasi Storage engine pada CREATE TABLE statements:
CREATE TABLE tabel1 (i INT) ENGINE = INNODB;
CREATE TABLE tabel2 (i INT) ENGINE = CSV;
CREATE TABLE tabel3 (i INT) ENGINE = MEMORY;

Student dapat juga melakuan pengaturan default pada session saat ini yang berguna
sebagai nilai default pada saat membuat table dengan menggunakan perintah:
SET default_storage_engine=ARCHIVE;

Jika ingin merubah mode dari storage engine pada sutatu tabel bisa menggunakan
perintah seperti dibawah ini:
ALTER TABLE foo ENGINE = InnoDB;

Untuk melihat Storage engine yang digunakan pada table dapat menggunakan perintah
seperti di bawah ini:
SHOW TABLE STATUS FROM test WHERE Name='foo'
SHOW TABLE STATUS LIKE 'foo';
SELECT * FROM information_schema.tables WHERE table_schema = DATABASE();

Hasilnya:
mysql> SHOW TABLE STATUS LIKE 'foo' \G
*************************** 1. row ***************************
Name: foo
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 2

Page 123

MySQL Database Administration

versi 1.0 (Maret) 2015

Avg_row_length: 8192
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 8388608
Auto_increment: NULL
Create_time: 2015-04-06 17:07:12
Update_time: NULL
Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)

InnoDB Storage Engine


InnoDB adalah storage engine yang menyeimbangkan kehandalan tinggi dan
kinerja tinggi, serta merupakan default storage engine versi MySQL 5.5 keatas.
Keuntungan menggunakan InnoDB storage engine

InnoDB mempunyai performa yang baik dalam memproses data volumes yang
besar.

Merupakan DML operations (add, update and delete data) dan kompatibel dengan
model ACID (atomic, consistent, isolated and durable), serta mempunyai kemapuan
transactions featuring commit, rollback, and crash-recovery untuk menjaga
konsistensi user data.

Row-level locking (locks ditempatkan dalam single records (rows) system sehingga
dapat meningkatkan perfomance dari system concurrency multi-user. Semua lock
process dari InnoDB dipegang oleh transaksi yang dilepaskan pada saat transaksi
sudah di commit atau dibatalkan.

InnoDB tables menggunakan sistem Primary key sehingga proses query menjadi
lebih optimal dan menurunkan beban kerja disk.

InnoDB support FOREIGN KEY constraints

yang digunakan untuk menjaga

integritas data. Olehkarena itu setiap ada perintah insert, update, dan delete akan
diperiksa untuk memastikan tidak terjadinya inkonsistensi data antar pada table
yang berbeda.

Keutungan lainya adalah dapat me Mix table dengan format InnoDB dengan format
storage

engine

MySQL

lainya.

Sebagai

Page 124

contoh,

memungkinkan

untuk

MySQL Database Administration

versi 1.0 (Maret) 2015

menggunakan operasi JOIN untuk mengkombinasikan data yang berasal dari


InnoDB dan MEMORY tables dalam query yang sama.
Membuat tabel tipe InnoDB
Gunakan CREATE TABLE statement untuk membuat InnoDB table tanpa klausul
khusus. Pada MySQL 5.6, pada saat menjalankan perintah CREATE TABLE statement
tampa mendifine Storage engine, defaultnya akan menjadi innoDB table. Berikut
contohnya:
CREATE TABLE table4 (col1 INT, col2 CHAR(30), PRIMARY KEY

(col1));

DESC table4;
+-------+----------+------+-----+---------+-------+
| Field | Type

| Null | Key | Default | Extra |

+-------+----------+------+-----+---------+-------+
| col1

| int(11)

| NO

| col2

| char(30) | YES

| PRI | 0

| NULL

+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)

Berikut keluaran informasi dari table4:


SHOW TABLE STATUS FROM test where Name='table4' \G
*************************** 1. row ***************************
Name: table4
Engine: InnoDB
Version: 10
Row_format: Fixed
Rows: 0
Avg_row_length: 35
Data_length: 0
Max_data_length: 10485755
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2015-04-07 13:03:26
Update_time: NULL
Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)

Penanganan AUTO_INCREMENT pada InnoDB


InnoDB menyediakan metode yang meningkatkan skalabilitas dan kinerja dari SQL
statements yang menyisipkan baris ke dalam tabel degan mode AUTO_INCREMENT yang

Page 125

MySQL Database Administration

versi 1.0 (Maret) 2015

otomatis. Untuk dapat menggunakan mekanisme AUTO_INCREMENT pada InnoDB tabel,


kolom AUTO_INCREMENT (col1 dalam contoh) harus didefinisikan sebagai bagian dari
indeks. Lihat contoh dibawah ini :
CREATE TABLE table5 (col1 INT(10) NOT NULL AUTO_INCREMENT, col2 CHAR(30),
PRIMARY KEY (col1));
DESC table5;
+-------+----------+------+-----+---------+----------------+
| Field | Type
| Null | Key | Default | Extra
|
+-------+----------+------+-----+---------+----------------+
| col1 | int(10) | NO
| PRI | NULL
| auto_increment |
| col2 | char(30) | YES |
| NULL
|
|
+-------+----------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

Penanganan FOREIGN KEY Constraints pada InnoDB


MySQL mendukung teknologi foreign keys, yang memungkinkan data dapat crossreference antar beberapa tabel, dan foreign key constraints, yang membantu menjaga
data yang tetap konsisten walaupun menyebar. Definisi Foreign key untuk tabel InnoDB
dijelaskan pada kondisi berikut:
1. InnoDB dapat memungkinkan foreign key untuk mereferensikan setiap kolom
indeks atau kelompok kolom. Namun, pada tabel referensi harus mempunyai
indeks di mana kolom direferensikan terdaftar sebagai kolom pertama dalam urutan
yang sama.
2. InnoDB saat ini tidak mendukung foreign keys untuk tabel dengan partisi yang
didefine sendiri oleh.
3. InnoDB mengijinkan foreign key constraint mereferensikan ke non-unique key.
Limitasi pada tabel InnoDB

Mengijinkan sampai dengan maximum 1017 column dalam satu table.

Mengijnkan maximum 64 secondary index dalam satu table. Secondary index


adalah jenis indeks InnoDB yang mewakili bagian dari kolom tabel.

Secara default, index key dari single-column bisa sampai 767 byte. Batas panjang
yang sama berlaku untuk setiap index key.

InnoDB panjang dari internal maximum key adalah 3500 bytes, Namun dari MySQL
hanya mengijinkan sampai dengan 3072 bytes (kombinasi antara index key dalam
multi-column index).

Panjang dari maximum row adalah 8000 bytes untuk setinggan default page

Page 126

MySQL Database Administration

versi 1.0 (Maret) 2015

sebesar 16KB. Kecual untuk variable-length column (VARBINARY, VARCHAR,


BLOB and TEXT).

Secara internal, InnoDB supports row sizes lebih besar dari 65,535 bytes, tapi
MySQL sendiri membebankan batas row sizes sampai dengan 65.535 untuk ukuran
gabungan dari semua kolom.

Maximum dari table space size adalah empat miliar dari database pages (64TB)
dan ukuran minimum table space lebih besar sedikit dari 10MB.

MyISAM Storage Engine


MyISAM storage engine didasarkan pada ISAM Storage engine model lama (saat
ini sudah tidak tersedia), tetapi memiliki banyak ekstensi yang berguna.
Setiap tabel MyISAM disimpan pada disk dalam tiga file.

Sebuah file .frm menyimpan format tabel.

File data memiliki extensi .MYD (myData).

File indeks memiliki extensi .MYI (MYIndex).

Membuat tipe MyISAM table


Gunakan CREATE TABLE statement untuk membuat MyISAM table dengan
menambahkan clause ENGINE.

Untuk MySQL versi 5.6 keatas harus menambahkan

clause ENGINE dikarenakan default dari Storage enginenya adalah InnoDB. Berikut
contoh membuat table dengan Storage engine MyISAM.
CREATE TABLE table7 (col1 INT, col2 CHAR(30)) ENGINE = MYISAM;
SHOW TABLE STATUS FROM test WHERE Name='table7' \G
*************************** 1. row ***************************
Name: table7
Engine: MyISAM
Version: 10
Row_format: Fixed
Rows: 0
Avg_row_length: 0
Data_length: 0
Max_data_length: 9851624184872959
Index_length: 1024
Data_free: 0
Auto_increment: NULL
Create_time: 2015-04-07 14:57:23

Page 127

MySQL Database Administration

versi 1.0 (Maret) 2015

Update_time: 2015-04-07 14:57:23


Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.03 sec)

Karakteristik utama dari tabel tipe MyISAM:

Panjang file sampai dengan 63-bit, dengan catatan System operasi mendukung
Large File pada file systemnya

(232) 2 (1.844E + 19) baris yang diperbolehkan dalam tabel MyISAM.

Maksimum 64 jumlah indeks dan 16 jumlah kolom per indeks yang diperbolehkan.

Panjang maksimum Key adalah 1000 byte.

Mendukung AUTO_INCREMENT column per table yang ditangani secara internal

Dapat menempatkan file data dan file indeks dalam direktori yang berbeda serta
pada hardisk yang berbeda sehingga mendapatkan speed dan perfoma yang lebih
baik. Agar dapat mengaktifkan fasilitas tersebut dengan cara menambahkan clause
DATA DIREKTORI dan table INDEKS DIREKTORI pada saat CREATE TABLE.

BLOB dan TEXT kolom dapat diindeks.

Mengijinkan Nilai NULL dalam kolom yang terindex. Besaran ukuran yang
dibutuhkan adalah 0-1 byte per key.

Setiap kolom karakter dapat memiliki satu set karakter yang berbeda.

Mendukung sepenuhnya type VARCHAR.

Tabel dengan kolom type VARCHAR dapat mempunya panjang yang sudah di
tetapkan atau yang dinamis.

Jumlah panjang dari VARCHAR dan kolom CHAR dalam sebuah tabel bisa sampai
64KB.

Penyebak korupnya table MyISAM


Format tabel MyISAM sangat handal, namun dalam beberapa kesempatan
kerusakan table tidak dapat dihindari, adapun beberapa point yang dapat menyebapkan
rusaknya table MyISAM adalah:

Process mysqld (MySQL Server) mati secara seketika pada saat sedang menulis.

Kegagalan perangkat keras.

Page 128

MySQL Database Administration

versi 1.0 (Maret) 2015

Terjadi shutdown komputer tak terduga.

Menggunakan external progam untuk merubah table.

Bug perangkat lunak MySQL atau kode MyISAM.

MEMORY Storage Engine


MEMORY storage engine menciptakan tabel yang disimpan dalam memori. Karena
data dapat hilang pada saat terjadi masalah hardware, Student hanya dapat
menggunakan tabel ini sebagai area kerja sementara atau read-only cache untuk dapat
digunakan pada table yang lainya. Pada saat server MySQL dimatikan atau direstart, data
dalam tabel dengan tipe MEMORY akan hilang.
Membuat table tipe MEMORY
Gunakan CREATE TABLE statement untuk membuat table denga tipe MEMORY
dengan

ditambahkan

clause

ENGINE.

Untuk

MySQL versi

5.6

keatas

harus

menambahkan clause ENGINE dikarenakan default dari Storage enginenya adalah


InnoDB. Berikut contoh membuat table dengan Storage engine tipe MEMORY :
CREATE TABLE table8 (col1 INT, col2 CHAR(30)) ENGINE = MEMORY;
SHOW TABLE STATUS FROM test WHERE Name='table8' \G
*************************** 1. row ***************************
Name: table8
Engine: MEMORY
Version: 10
Row_format: Fixed
Rows: 0
Avg_row_length: 35
Data_length: 0
Max_data_length: 14680050
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2015-04-07 15:38:15
Update_time: NULL
Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL

Page 129

MySQL Database Administration

versi 1.0 (Maret) 2015

Menghapus table tipe MEMORY

Gunakan SQL statements DROP untuk menghapus table dengan tipe


MEMORY
DROP TABLE table8;

MEMORY storage engine mendukung HASH dan BTREE tipe index. Untuk dapat
mengaktifkanya kita dapat menambahkan clause tersebut pada saat membuat table tipe
MEMORY. Berikut contohnya:
CREATE TABLE table9 (id INT, INDEX USING HASH (id)) ENGINE = MEMORY;
CREATE TABLE table10 (id INT, INDEX USING BTREE (id)) ENGINE = MEMORY;

Kapan harus menggunakan MEMORY storage engine

Operasi yang melibatkan hal sementara, data yang tidak critical seperti manajemen
sesi atau caching.

Media penyimpanan In-memory untuk dapat akses yang cepat and latency yang
rendah. Volume data yang dapat ditampung seluruhnya dalam memori tampa
menggunakan swap atau virtual memory pages pada operating system.

Sebuah index key untuk single-column index yang besaranya bisa mencapai to 767
bytes. Batas panjang yang sama berlaku untuk setiap ndex key prefixi.

Page 130

MySQL Database Administration

versi 1.0 (Maret) 2015

Bagian 7

MEMAKSIMALKAN KINERJA

Page 131

MySQL Database Administration

versi 1.0 (Maret) 2015

Bab 14
Memaksimalkan Kinerja MySQL

Check Standar Keamanan

Parameter pada MySQL

Beberapa cara memaksimalkan kinerja

Database Tunning
Database Tuning adalah sejumlah aktifitas yang dilakukan untuk memperbaiki atau
meningkatkan kinerja atau performance sebuah database. Aktifitas tuning ini meliputi
banyak aspek dari software hingga hardware, antara lain I/O Tuning, DBMS Tuning, Query
Tuning, dan Database Maintenance. Masing-masing memiliki tekniknya sendiri-sendiri,
dan membutuhkan skill yang mumpuni.
Beberapa point dalam optimasi database MySQL adalah sebagai berikut:
1. Optimasi Query dengan bantuan Database Index
2. Optimasi MySQL variable di file my.ini (my.cnf).
3. Optimasi Struktur Table.
4. Optimasi SQL Query.

Optimasi Query dengan bantuan Database Index


Umumnya programmer pada saat mengembangkan sebuah aplikasi database,
pasti akan membuat sebuah database dan memasukkan beberapa data contoh ke
dalamnya. Pada saat pengembangan, tidak ada masalah dan kelihatannya semua baikbaik saja, namun seiring berjalannya waktu, aplikasi mulai terkesan lambat dan bisa jadi
sampai tidak dapat di akses. Hal ini terjadi karena biasanya programmer tidak pernah
melakukan load testing menggunakan data besar, dalam artian, jumlah row yang banyak.
Untuk contoh kasus diatas, kita akan menggunakan database MySQL dan
membuat sebuah table sederhana saja berisikan 9 (sembilan) juta rows, caranya seperti
terlihat di bawah ini. perlu waktu sekitar 2 menit untuk men-generate table contoh tersebut.
Perlu diperhatikan, setelah perintah di bawah ini selesai, maka baru table saja yang

Page 132

MySQL Database Administration

versi 1.0 (Maret) 2015

dibuat, belum ada index.


CREATE
select
from (
join (
join (
join (

TABLE big_table AS
@baris := @baris+1 as baris
select @baris := 0 ) x
select 1 kolom from information_schema.tables ) a
select 1 kolom from information_schema.tables ) b
select 1 kolom from information_schema.tables ) c ;

Query OK, 1191016 rows affected (14.11 sec)


Records: 1191016

Duplicates: 0

Warnings: 0

Salah satu teknik yang banyak digunakan dalam aplikasi database adalah
pagination, dimana teknik ini mengharuskan kita mengetahui total rows yang ada dalam
sebuah table untuk menentukan jumlah page yang ada. Coba kita lakukan query
count(*) untuk mengetahui total rows dalam table tersebut, dan lihat waktu yang
diperlukan untuk mendapatkan hasilnya.
SELECT count(*) FROM big_table ;
+----------+
| count(*) |
+----------+
| 1191016 |
+----------+
1 row in set (0.33 sec)

Rupanya perlu waktu 18 detik untuk mendapatkan hasilnya. Untuk user yang
penyabar, mungkin hal ini tidak menjadi masalah besar. Sekarang kita coba lihat
execution plan yang dipilih oleh mysql saat mengeksekusi perintah count(*) yang kita
berikan, maka terlihat seperti di bawah ini, bahwa mysql melakukan full table scan,
ditandai dengan type=ALL pada execution plan yang muncul. Full table scan artinya,
mysql meload seluruh table ke memory dan menghitung row yang ada di dalamnya satu
persatu.
EXPLAIN SELECT count(*) FROM big_table;
+----+-------------+-----------+------+---------------+------+---------+------+---------+-------+
| id | select_type | table
| type | possible_keys | key | key_len | ref | rows
| Extra |
+----+-------------+-----------+------+---------------+------+---------+------+---------+-------+
| 1 | SIMPLE
| big_table | ALL | NULL
| NULL | NULL
| NULL | 1191651 |
|
+----+-------------+-----------+------+---------------+------+---------+------+---------+-------+
1 row in set (0.00 sec)

Sekarang kita coba lagi dengan model query lain yang sangat umum, yaitu query
searching dengan menggunakan WHERE clause. Kita coba mencari sebuah row tertentu
yang kira-kira lokasinya ada di tengah-tengah table. Pada contoh di bawah ini bisa terlihat

Page 133

MySQL Database Administration

versi 1.0 (Maret) 2015

bahwa mysql tetap melakukan full table scan ke seluruh rows, padahal row yang kita
inginkan sudah ditemukan di tengah-tengah table. Dan rupanya perlu waktu lebih lama,
yaitu 19 detik, dibandingkan dengan proses count(*) yang hanya 18 detik.
SELECT * FROM big_table WHERE baris = 5346781;
Empty set (19 sec)

Execution plan mengkonfirmasikan bahwa mysql melakukan full table scan dari row
pertama sampai row terakhir, padahal kita hanya menginginkan satu row saja.
EXPLAIN SELECT * FROM big_table WHERE baris = 5346781 \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: big_table
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 1191651
Extra: Using where
1 row in set (0.00 sec)

Mari kita buat index tablenya untuk mempercepat proses query.


CREATE INDEX big_table_pk ON big_table(baris) ;

Index selesai dibuat, dan kita coba lakukan proses penghitungan jumlah rows
menggunakan query yang sama seperti sebelumnya. dan hasilnya muncul dalam 10 detik,
sebuah peningkatan yang luar biasa dari 18 detik menjadi 10 detik saja (y)
SELECT count(*) FROM big_table ;
+----------+
| count(*) |
+----------+
|

1191016 |

+----------+
1 row in set (10 sec)

Jika kita lihat execution plan, maka mysql tidak lagi menggunakan full table scan,
namun sekarang menggunakan index scan. walaupun masih melakukan scan ke seluruh
rows sebanyak 9 juta, namun index scan jauh leih cepat dibandingkan full table scan.

Page 134

MySQL Database Administration

versi 1.0 (Maret) 2015

EXPLAIN SELECT * FROM big_table WHERE baris = 5346781 \G


*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: big_table
type: ref
possible_keys: big_table_pk
key: big_table_pk
key_len: 9
ref: const
rows: 1
Extra: Using where; Using index
1 row in set (0.05 sec)

Sekarang test menggunakan query searching, dan hasilnya muncul sangat cepat, hanya
0.05 detik.
SELECT * FROM big_table
+---------+
|

baris

+---------+
|

. . . . . .
| 1191016 |
+---------+
1191016 rows in set (0.05 sec)

SELECT * FROM big_table WHERE


+---------+
| baris
|
+---------+
| 5346781 |
+---------+
1 row in set (0.05 sec)

baris = 5346781 ;

Jika kita lihat execution plan, maka mysql tidak lagi melakukan scan ke seluruh rows,
namun langsung menuju satu row yang kita inginkan. Peningkatan kinerja pencarian dari
19 detik menjadi 0.05 detik adalah peningkatan sangat baik.
Perlu diperhatikan bahwa INDEX yang di buat berdasarkan FIELD yang terlibat
dalam WHERE clause, sehingga Query Optimizer di MySQL otomatis akan mengenali
index tersebut dan menggunakannya untuk proses pencarian.

Page 135

MySQL Database Administration

versi 1.0 (Maret) 2015

Optimasi MySQL variable


MySQL secara default menggunakan konfigurasi moderate, dalam arti bahwa
konfigurasi yang yang diberikan merupakan konifgurasi yang menyesuaikan dengan
sistem server secara umum. Ada penyesuaian antara performa dengan stabilitas. Tidak
diset performa tinggi agar tidak mempengaruhi stabilitas sistem.
Untuk parameter yang ditune up, tidak perlu dihapalkan satu persatu, karena
MySQL sudah menyediakannya pada folder /usr/share/mysql. Pada folder tersebut ada
nama file konfigurasi : my-small.cnf, my-medium.cnf, my-large.cnf dan my-huge.cnf yang
dapat digunakan sebagai template konfigurasi.
Pada bagian ini yang akan dibahas adalah Optimasi MySQL variable. Yaitu kita
akan men-edit variable-variable bawaan dari instalasi awal MySQL. Karena secara default
settingan variable MySQL adalah memungkinkan untuk berjalan dikomputer minim
resource (spesifikasi hardware rendah), untuk kebutuhan production/live terlebih lagi
apabila spesifikasi hardware Database Server kita tinggi, maka hal ini tentunya kurang
relevan lagi.
Proses edit variable MySQL bisa dengan berbagai cara, tapi yang akan kita pakai
adalah langsung mengedit file my.ini (windows) atau my.cfg (linux). Harap mematikan
terlebih dulu service MySQL apabila sendang berjalan, masuk ke commandline (cmd)
Windows/Linux, ketik :
mysqladmin -u[username] -p[password] shutdown

Untuk mengeksekusi perintah diatas, pastikan mysql console telah terdaftar di


Environment Variable Windows, dan user yang digunakan memiliki hak Akses penuh
(sysdba). Kemudian silakan ke folder instalasi MySQL, kemudian cari file my.ini (my.cfg)
Contoh lokasinya.
Besaran dari nilai yang akan dirubah bergantung kepada kebutuhan dan karakter
dari aplikasi yang menggunakan database tersebut, hampir tiap aplikasi / CMS
mempunyai karateristik dan value settingan yang berbeda sehingga tidak ada nilai pasti
dalam melalukan perubahan nilai pada variable konfigurasi MySQL.

Page 136

MySQL Database Administration

versi 1.0 (Maret) 2015

Berikut ini adalah variable-variable yang sering digunakan untuk tuning:


1. max_connections
Adalah maksimum sambungan yang dapat dilakukan dalam waktu sekaligus, kalau
website termasuk sangat sibuk, semakin besar tentunya akan semakin bagus, akan tetapi
sudah pasti bahwa karena resource server akan semakin banyak dipakai maka CPU atau
memory akan semakin termakan oleh proses MySQL.
Oleh karena itu, nilai max_connections dapat disinkronkan dengan besar memory
server dan akses maksimum Apache server pada bagian MaxClient. Tidak ada artinya
memperbesar nilai tersebut namun pada MaxClient di Apache nilainya masih sangat kecil,
misalnya hanya sekitar 50 sambungan saja. Nilai defaultnya adalah 151 (mariadb)
SHOW VARIABLES WHERE Variable_name = 'max_connections' ;
+-----------------+-------+
| Variable_name
| Value |
+-----------------+-------+
| max_connections | 151
|
+-----------------+-------+

2. query_cache_size
Apabila MySQL server sibuk dan selalu mengulang-ulang query yang sama, maka
settting query_cache_size perlu diperhatikan. query_cache_size akan menyimpan query
yang berulang, sehingga akan mempercepat kerja MySQL untuk query yang sama.
Karena query yang sebelumnya disimpan dalam memory cache. Nilai defaultnya adalah 0
(mariadb)
SHOW VARIABLES WHERE Variable_name = 'query_cache_size' ;
+------------------+-------+
| Variable_name
| Value |
+------------------+-------+
| query_cache_size | 0
|
+------------------+-------+

3. key_buffer_size
Data base menggunakan key index. Karena itu apabila index ini tersimpan dalam
satu memori secara utuh, maka sudah tentu proses MySQL server akan semakin cepat
untuk mendapatkan hasil dari query yang diinginkan. Secara ideal semua index akan
bagus tersimpan dalam memory ini, akan tetapi perlu juga melihat kemampuan kapasitas
memory server.
Untuk kebutuhan table yang menggunakan engine MyISAM. Max 25% dari total
memory (RAM) Hardware dalam satuan MB, misal memory server 3GB (3002 MB * 25%=

Page 137

MySQL Database Administration

versi 1.0 (Maret) 2015

750,5 MB) maka bisa di edit menjadi 750M. apabila tidak ada table MyISAM sebaiknya
disetting menjadi 16-32M. Nilai defaultnya adalah 128MB (mariadb)
SHOW VARIABLES WHERE Variable_name = 'key_buffer_size' ;
+-----------------+-----------+
| Variable_name
| Value
|
+-----------------+-----------+
| key_buffer_size | 134217728 |
+-----------------+-----------+

134217728 bytes = 128MB


4. table_cache (mysql) table_open_cache (mariadb)
Apabila MySQL server banyak menggunakan table query, maka besar memori pada
konfigurasi ini juga perlu di perhatikan. Karena akan mempercepat proses query yang
berhubungan dengan table. Nilai defaultnya adalah 400 (mariadb)
SHOW VARIABLES WHERE Variable_name = 'table_open_cache' ;
+------------------+-------+
| Variable_name
| Value |
+------------------+-------+
| table_open_cache | 400
|
+------------------+-------+

5. sort_buffer_size
Apakah MySQL server memiliki query atau operasi myisamchk atau sort ? Maka
option ini sangat penting untuk di perhatikan. Dengan memasang buffer yang besar
tentunya akan melakukan sorting secara besar juga. Memperbesar pada nilai ini akan
mempercepat sorting. Nilai defaultnya adalah 2MB (mariadb)
SHOW VARIABLES WHERE Variable_name = 'sort_buffer_size' ;
+------------------+---------+
| Variable_name
| Value
|
+------------------+---------+
| sort_buffer_size | 2097152 |
+------------------+---------+

Pengetesan, pertama buat table dengan menggunakan Storage engine myisamchk


CREATE TABLE `sorttest` (
`data` char(30) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| sorttest
|

Page 138

MySQL Database Administration

versi 1.0 (Maret) 2015

+----------------+

Dan tambahkan 100k row dengan menggunakan bash script ini


#!/bin/bash
NUMROW=100000
COUNT=0
while [ "$NUMROW" -gt "$COUNT" ]
do
UUID=`uuidgen`
mysql -u root -p'password'
('$UUID');"
let "COUNT=COUNT+1"
done

SELECT count(*)
+----------+
| count(*) |
+----------+
|
100000 |
+----------+

Setelah

100k

test

-e

"insert

into

sorttest

value

FROM sorttest;

row

terbuat,

dilanjutkan

dengan

melakukan

pengetesan

dengan

menggunakan bash script dibawah ini


#!/bin/bash
for i in `seq 1 1000`
do
START=`date +%s.%N`
OUT=`mysql
-uroot -p'password -e "set session
sort_buffer_size=32*1024*$i;select * from sorttest order by data
limit
78000,1;show
session
status
like
'Sort_merge_passes';select * from sorttest order by data limit
78000,1;select
*
from
sorttest
order
by
data
limit
78000,1;select
*
from
sorttest
order
by
data
limit
78000,1;select
*
from
sorttest
order
by
data
limit
78000,1;select
*
from
sorttest
order
by
data
limit
78000,1;select
*
from
sorttest
order
by
data
limit
78000,1;select
*
from
sorttest
order
by
data
limit
78000,1;select
*
from
sorttest
order
by
data
limit
78000,1;select
*
from
sorttest
order
by
data
limit
78000,1;select
*
from
sorttest
order
by
data
limit
78000,1;select * from sorttest order by data limit 78000,1;"
test`
END=`date +%s.%N`
MERGE=`echo $OUT | cut -d' ' -f6`
TIME=`echo "$END - $START" | bc`
echo "$i $MERGE $TIME"
done

Page 139

MySQL Database Administration

versi 1.0 (Maret) 2015

sort_buffer_size=32*1024*100

sort_buffer_size=1024*1024*100

sort_buffer_size=4096*1024*100

6. read_rnd_buffer_size
read_rnd_buffer_size digunakan setelah client melakukan sorting. Yaitu untuk
memproses row dari query sorting yang telah kita lakukan. Apabila query server sering
memakai ORDER BY, maka option ini perlu diperhatikan. Cara menghitung besar buffer ini
dengan logika 1 MB adalah 1KB, jadi apabila memory server adalah 1GB, maka dapat
merubahnya menjadi sebesar 1MB. Nilai defaultnya adalah 256KB (mariadb)
SHOW VARIABLES WHERE Variable_name = 'read_rnd_buffer_size' ;
+----------------------+--------+
| Variable_name
| Value |
+----------------------+--------+
| read_rnd_buffer_size | 262144 |
+----------------------+--------+

Page 140

MySQL Database Administration

versi 1.0 (Maret) 2015

7. thread_cache (mysql) thread_cache_size (mariadb)


Apabila server sibuk dengan banyaknya query dan memerlukan respon yang
sangat

cepat,

maka

thread_cache/thread_cache_size

adalah

option

yang

perlu

perhatikan. Karena jika semakin besar nilai ini, akan semakin tinggi juga load CPU server.
SHOW VARIABLES WHERE Variable_name = 'thread_cache_size' ;
+-------------------+-------+
| Variable_name
| Value |
+-------------------+-------+
| thread_cache_size | 0
|
+-------------------+-------+

8. tmp_table_size
tmp_table_size akan memberikan kesempatan kepada MySQL untuk menyimpan
table ke dalam harddisk yang dianggap sebagai memory. Sudah tentu tmp_table_size
akan memperlambat kecepatan MySQL. Apabila server mempunyai memory yang minim
dan kecepatan MySQL tidak begitu diperhitungkan, barangkali ini adalah option yang
dapat digunakan. Nilai defaultnya adalah 16MB (mariadb)
SHOW VARIABLES WHERE Variable_name = 'tmp_table_size' ;
+----------------+----------+
| Variable_name | Value
|
+----------------+----------+
| tmp_table_size | 16777216 |
+----------------+----------+

Bagaimana cara menghitung memory yang diperlukan oleh MySQL Server dengan
mudah ? Gunakan rumus sederhana berikut ini.
memory=key_buffer+(sort_buffer_size+read_buffer_size)*max_connections

9. innodb_buffer_pool_size
Untuk kebutuhan table yang menggunakan engine InnoDB. Cara menghitung
maximalnya adalah 70% dari total memory (RAM) Hardware dalam satuan MB, semisal
memory adalah 3GB (3002 MB * 25%= 2101,4 MB) maka kita dapat merubah nilainya
menjadi 2101M. Nilai defaultnya adalah 128MB (mariadb)
SHOW VARIABLES WHERE Variable_name = 'innodb_buffer_pool_size' ;
+-------------------------+-----------+
| Variable_name
| Value
|
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+

Page 141

MySQL Database Administration

versi 1.0 (Maret) 2015

10. read_buffer_size
Cara menghitungnya adalah dengan membagi 2 nilai dari sort_buffer_size, adapun nilai
defaultnya adalah 128KB (mariadb)
SHOW VARIABLES WHERE Variable_name = 'read_buffer_size' ;
+------------------+--------+
| Variable_name
| Value |
+------------------+--------+
| read_buffer_size | 131072 |
+------------------+--------+

11. innodb_flush_log_at_trx_commit
Konfigurasi pada valui ini hanya opsional, apabila edit menjadi 0 (nol) bisa menjadi
sedikit lebih cepat, namun kekurangannya adalah memungkinkan untuk kehilangan data
yang sedang ditransaksikan apabila server crash.
SHOW VARIABLES WHERE Variable_name = 'innodb_flush_log_at_trx_commit' ;
+--------------------------------+-------+
| Variable_name
| Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1
|
+--------------------------------+-------+

Optimasi MySQL dengan script


Cara lain yang cukup mudah untuk memastikan bahwa MySQL Server yang
terinstall sudah dikonfigurasi dengan baik, yaitu dengan menggunakan script MySQL
Tunning, beberapa contoh dari script tersebut adalah:
1. Tuning-primer: MySQL performance tuning primer script
2. MySQLTuner-perl
MySQLTuner-perl script ini dibuat dengan bahasa Perl dan akan melakukan
pengecekan terhadap konfigurasi database MySQL yang kita miliki. Jangan lupa untuk
membackup file konfigurasi yang ada sebelum menjalankannya.
Penggunaan MySQL Tunner Script
Download terlebih dahulu MySQL Tunner
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl

Page 142

MySQL Database Administration

versi 1.0 (Maret) 2015

Jalankan MySQL Tunner dengan menggunakan perintah berikut:


perl mysqltuner.pl

Contoh hasil outputnya:


>> MySQLTuner 1.4.0 - Major Hayden <major@mhtx.net>
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/
>> Run with '--help' for additional options and output filtering
Please enter your MySQL administrative login: root
Please enter your MySQL administrative password:
[OK] Currently running supported MySQL version 5.5.41-MariaDB-log
[OK] Operating on 64-bit architecture
-------- Storage Engine Statistics ------------------------------------------[--] Status: +ARCHIVE +Aria +BLACKHOLE +CSV +FEDERATED +InnoDB +MRG_MYISAM
[--] Data in MyISAM tables: 3M (Tables: 9)
[--] Data in InnoDB tables: 6G (Tables: 694)
[--] Data in PERFORMANCE_SCHEMA tables: 0B (Tables: 17)
[--] Data in MEMORY tables: 620K (Tables: 34)
[!!] Total fragmented tables: 695
-------- Security Recommendations ------------------------------------------[OK] All database users have passwords assigned
-------- Performance Metrics ------------------------------------------------[--] Up for: 9d 22h 17m 49s (116M q [136.299 qps], 1M conn, TX: 327B, RX: 65B)
[--] Reads / Writes: 97% / 3%
[--] Total buffers: 6.4G global + 2.9M per thread (512 max threads)
[OK] Maximum possible memory usage: 7.9G (51% of installed RAM)
[OK] Slow queries: 2% (2M/116M)
[OK] Highest usage of available connections: 50% (259/512)
[OK] Key buffer size / total MyISAM indexes: 256.0M/1.3M
[OK] Key buffer hit rate: 96.8% (155K cached / 4K reads)
[OK] Query cache efficiency: 48.0% (100M cached / 208M selects)
[!!] Query cache prunes per day: 579946
[OK] Sorts requiring temporary tables: 0% (88 temp sorts / 2M sorts)
[!!] Joins performed without indexes: 63229
[!!] Temporary tables created on disk: 31% (1M on disk / 4M total)
[OK] Thread cache hit rate: 99% (880 created / 1M connections)
[!!] Table cache hit rate: 2% (776 open / 29K opened)
[OK] Open file limit used: 0% (8/2K)
[OK] Table locks acquired immediately: 99% (42M immediate / 42M locks)
[!!] InnoDB buffer pool / data size: 6.0G/6.2G
[OK] InnoDB log waits: 0
-------- Recommendations ----------------------------------------------------General recommendations:
Run OPTIMIZE TABLE to defragment tables for better performance
Adjust your join queries to always utilize indexes
When making adjustments, make tmp_table_size/max_heap_table_size equal
Reduce your SELECT DISTINCT queries without LIMIT clauses
Increase table_open_cache gradually to avoid file descriptor limits
Read this before increasing table_open_cache over 64: http://bit.ly/1mi7c4C
Variables to adjust:
query_cache_size (> 128M)
join_buffer_size (> 256.0K, or always use indexes with joins)
tmp_table_size (> 32M)
max_heap_table_size (> 32M)
table_open_cache (> 800)
innodb_buffer_pool_size (>= 6G)

Pada bagian Variable to adjust kita sudah mendapatkan parameter mana saja yang dapat
digunakan untuk memaksimalkan kinerja MySQL.

Page 143

MySQL Database Administration

versi 1.0 (Maret) 2015

Penggunaan MySQL Tunning Primer Script


Download terlebih dahulu script tunning-primer
wget https://launchpadlibrarian.net/78745738/tuning-primer.sh

Jalankan dengan menggunakan perintah:


./tuning-primer.sh

Berikut hasil pada saat menjalankan script tersebut


Using login values from ~/.my.cnf
- INITIAL LOGIN ATTEMPT FAILED Testing for stored webmin passwords:
None Found
Could not auto detect login info!
Found potential sockets: /var/lib/mysql/mysql.sock
Using: /var/lib/mysql/mysql.sock
Would you like to provide a different socket?: [y/N] n
Do you have your login handy ? [y/N] : y
User: root
Password: password
Would you like me to create a ~/.my.cnf file for you? [y/N] : y
~/.my.cnf already exists!
Replace ? [y/N] : y
-- MYSQL PERFORMANCE TUNING PRIMER -- By: Matthew Montgomery MySQL Version 5.5.41-MariaDB-log x86_64
Uptime = 9 days 22 hrs 21 min 11 sec
Avg. qps = 136
Total Questions = 116945853
Threads Connected = 1
Server has been running for over 48hrs.
It should be safe to follow these recommendations
To find out more information on how each of these
runtime variables effects performance visit:
http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html
Visit http://www.mysql.com/products/enterprise/advisors.html
for info about MySQL's Enterprise Monitoring and Advisory Service
SLOW QUERIES
The slow query log is enabled.
Current long_query_time = 10.000000 sec.
You have 2487948 out of 116945874 that take longer than 10.000000 sec. to
complete
Your long_query_time seems to be fine
BINARY UPDATE LOG
The binary update log is enabled
Binlog sync is not enabled, you could loose binlog records during a server
crash

Page 144

MySQL Database Administration

versi 1.0 (Maret) 2015

WORKER THREADS
Current thread_cache_size = 64
Current threads_cached = 63
Current threads_per_sec = 0
Historic threads_per_sec = 0
Your thread_cache_size is fine
MAX CONNECTIONS
Current max_connections = 512
Current threads_connected = 1
Historic max_used_connections = 259
The number of used connections is 50% of the configured maximum.
Your max_connections variable seems to be fine.
INNODB STATUS
Current InnoDB index space = 1.04 G
Current InnoDB data space = 6.16 G
Current InnoDB buffer pool free = 0 %
Current innodb_buffer_pool_size = 6.00 G
Depending on how much space your innodb indexes take up it may be safe
to increase this value to up to 2 / 3 of total system memory
MEMORY USAGE
Max Memory Ever Allocated : 7.13 G
Configured Max Per-thread Buffers : 1.46 G
Configured Max Global Buffers : 6.39 G
Configured Max Memory Limit : 7.85 G
Physical Memory : 15.35 G
Max memory limit seem to be within acceptable norms
KEY BUFFER
Current MyISAM index space = 1 M
Current key_buffer_size = 256 M
Key cache miss rate is 1 : 31
Key buffer free ratio = 81 %
Your key_buffer_size seems to be fine
QUERY CACHE
Query cache is enabled
Current query_cache_size = 128 M
Current query_cache_used = 116 M
Current query_cache_limit = 8 M
Current Query cache Memory fill ratio = 90.99 %
Current query_cache_min_res_unit = 4 K
However, 5758316 queries have been removed from the query cache due to lack
of memory
Perhaps you should raise query_cache_size
MySQL won't cache query results that are larger than query_cache_limit in
size
SORT OPERATIONS
Current sort_buffer_size = 2 M
Current read_rnd_buffer_size = 256 K
Sort buffer seems to be fine
JOINS
./tuning-primer.sh: line 402: export: `2097152': not a valid identifier
Current join_buffer_size = 260.00 K
You have had 62647 queries where a join could not use an index properly
You have had 588 joins without keys that check for key usage after each row

Page 145

MySQL Database Administration

versi 1.0 (Maret) 2015

You should enable "log-queries-not-using-indexes"


Then look for non indexed joins in the slow query log.
If you are unable to optimize your queries you may want to increase your
join_buffer_size to accommodate larger joins in one pass.
Note! This script will still suggest raising the join_buffer_size when
ANY joins not using indexes are found.
OPEN FILES LIMIT
Current open_files_limit = 2565 files
The open_files_limit should typically be set to at least 2x-3x
that of table_cache if you have heavy MyISAM usage.
Your open_files_limit value seems to be fine
TABLE CACHE
Current table_open_cache = 800 tables
Current table_definition_cache = 800 tables
You have a total of 778 tables
You have 800 open tables.
Current table_cache hit rate is 2%
, while 100% of your table cache is in use
You should probably increase your table_cache
TEMP TABLES
Current max_heap_table_size = 32 M
Current tmp_table_size = 32 M
Of 4970956 temp tables, 23% were created on disk
Created disk tmp tables ratio seems fine
TABLE SCANS
Current read_buffer_size = 128 K
Current table scan ratio = 18 : 1
read_buffer_size seems to be fine
TABLE LOCKING
Current Lock Wait ratio = 1 : 68390
Your table locking seems to be fine

mysql_secure_installation
merupakan tools tambahan yang menjadi bawaan dari MySQL, tool ini dapat
digunakan untuk meningkatkan keamanan server MySQL
# mysql_secure_installation
/usr/bin/mysql_secure_installation: line 379: find_mysql_client: command not
found
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):
OK, successfully used password, moving on...

Page 146

MySQL Database Administration

versi 1.0 (Maret) 2015

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.
Set root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] y
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] y
... Success!
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!

Page 147

MySQL Database Administration

versi 1.0 (Maret) 2015

Bagian 8

MYSQL CLUSTER

Page 148

MySQL Database Administration

versi 1.0 (Maret) 2015

Bab 15
MariaDB High-Aavability Cluster

Instalasi MariaDB Galera Cluster

Replikasi master-master MariaDB

Pengecekan MariaDB Cluster

Installasi MariaDB Cluster pada Linux


Galera Cluster untuk MySQL adalah Multimaster Cluster yang sebenarnya
berdasarkan synchronous replication. Galera Cluster adalah, solusi ketersediaan tinggi
yang mudah digunakan, yang menyediakan sistem uptime yang tinggi, tanpa kehilangan
data dan skalabilitas untuk pertumbuhan di masa depan.
Fitur-fitur Galera Cluster

Synchronous replication

Active-active multi-master topology

Read dan write ke semua cluster node

Pengaturan keanggotaan cluster secara otomatis

Proses keanggotaan node secara otomatis

True parallel replication di level row

Direct client connections

Keuntugan menggunakan Galera Cluster

Perfoma yang baik pada sisi Slave

Tidak ada transaksi yang hillang

Skalabilitas untuk proses tulis dan baca

Latency yang kecil pada sisi client

Untuk percobaan pembuatan cluster akan menggunakan 2 buah database server yaitu
Server 1, IP Address 10.11.12.1 Name: db1
Server 2, IP Address 10.11.12.2 Name: db2
Operating System Centos 6.5 dengan Desktop Minimum install

Page 149

MySQL Database Administration

versi 1.0 (Maret) 2015

Topologi yang digunakan adalah sebagai berikut

Step 1: Konfigurasi Hosts File dan NTP


Sebelum memulai menkonfigurasi MariaDB Cluster, hal pertama yang dilakukan
adalah mengkonfigurasi file /etc/hosts untuk menambahkan static dns data, hal ini
berguna untuk mengurangi waktu dari sistem kerja Cluster dalam hal meresolve Dns.
Langkah berikutnya adalah dengan melanjutkan konfigurasi NTP Server sehingga bisa
mendapatkan jam yang akurat dan sama antar Server Cluster Node. Berikut langkah2nya
Pada Cluster db1 dan db2 server, ketikan perintah berikut:
echo
echo
ping
ping

10.11.12.1 db1 >> /etc/hosts


10.11.12.2 db2 >> /etc/hosts
db1
db2

Dilanjutkan dengan menkonfigurasi NTP Server


echo server 0.centos.pool.ntp.org
echo server 1.centos.pool.ntp.org
echo server 2.centos.pool.ntp.org
echo server 3.centos.pool.ntp.org
service ntpd restart
Shutting down ntpd:
Starting ntpd:

iburst
iburst
iburst
iburst

Page 150

>>
>>
>>
>>

/etc/ntp.conf
/etc/ntp.conf
/etc/ntp.conf
/etc/ntp.conf
[
[

OK
OK

]
]

MySQL Database Administration

versi 1.0 (Maret) 2015

Step 2: Mematikan fungsi Security default Linux


Centos/Red Hat mempunya security default yaitu: SElinux dan Iptables, kedua
service ini dapat menyebabkan tidak berjalanya cluster. Oleh karena itu untuk Selinux
baiknya di disable, dan untuk Iptables Firewall bisa di sesuaikan dengan kebutuhan.
Jalankan perintah di bawah ini untuk mematikan Selinux
Jalankan di kedua node
setenforce 0
sed -i s/SELINUX=enforcing/SELINUX=disabled/g

/etc/selinux/config

Jika firewall ingin tetap di aktifkan, port 3306, 4444, 4567, dan 4568 harus dimasukan
kedalam pengaturan firewall
Jalankan di kedua node
sudo lokkit
sudo lokkit
sudo lokkit
sudo lokkit
iptables -A
iptables -A
iptables -A
iptables -A

--port 3306:tcp
--port 4444:tcp
--port 4567:tcp
--port 4568:tcp
INPUT -p tcp dport
INPUT -p tcp dport
INPUT -p tcp dport
INPUT -p tcp dport

3306
4444
4567
4568

-j
-j
-j
-j

ACCEPT
ACCEPT
ACCEPT
ACCEPT

Step 3: Menambahkan Repository MariaDB


Versi MariaDB bawaan pada Distro Centos/Red Hat linux 6 adalah versi 5.5, untuk
mendapatkan MariaDB versi 10.0 buat file repository baru di folder /etc/yum.repos.d/
dengan nama /etc/yum.repos.d/mariadb.repo dan tambahkan isian di bawah ini:
Jalankan di kedua node
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.0/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Setelah ditambahkan, langkah berikutnya adalah menerapkan penambahan repository


tersebut dengan menggunama perintah di bawah ini:
Jalankan di kedua node
yum repolist

MariaDB membutuhkan paket socat yang terdapat pada repository EPEL (Extra Package
for Enterprise Linux), silahkan tambahakn repository EPEL dengan mengetikan perintah di
bawah:

Page 151

MySQL Database Administration

versi 1.0 (Maret) 2015

rpm -Uvh http://mirror.dionipe.net/fedora/epel/6/i386/epel-release-6-8.noarch.rpm


Retrieving http://mirror.dionipe.net/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
warning: /var/tmp/rpm-tmp.9wLXb9: Header V3 RSA/SHA256 Signature, key ID 0608b895:
NOKEY
Preparing...
########################################### [100%]
1:epel-release
########################################### [100%]

Step 4: Installasi MariaDB Software


Untuk menginstallasi MariaDB Software gunakan perintah YUM dengan format
seperti di bawah ini:
Jalankan di kedua node
yum install socat MariaDB-Galera-server MariaDB-client rsync galera
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
>>>>>>>>>>>>>> PEMOTONGAN <<<<<<<<<<<<<<<<
Alternatively consider joining our community based development effort:
http://mariadb.com/kb/en/contributing-to-the-mariadb-project/
Installing : socat-1.7.2.3-1.el6.x86_64
Erasing
: mysql-libs-5.1.71-1.el6.x86_64
Cleanup
: rsync-3.0.6-9.el6_4.1.x86_64
Verifying : galera-25.3.9-1.rhel6.el6.x86_64
Verifying : 2:nmap-5.51-4.el6.x86_64
Verifying : nc-1.84-22.el6.x86_64
Verifying : rsync-3.0.6-12.el6.x86_64
Verifying : compat-readline5-5.2-17.1.el6.x86_64
Verifying : MariaDB-common-10.0.17-1.el6.x86_64
Verifying : perl-DBI-1.609-4.el6.x86_64
Verifying : socat-1.7.2.3-1.el6.x86_64
Verifying : MariaDB-Galera-server-10.0.17-1.el6.x86_64
Verifying : MariaDB-compat-10.0.17-1.el6.x86_64
Verifying : MariaDB-client-10.0.17-1.el6.x86_64
Verifying : rsync-3.0.6-9.el6_4.1.x86_64
Verifying : mysql-libs-5.1.71-1.el6.x86_64
Installed:
MariaDB-Galera-server.x86_64 0:10.0.17-1.el6 MariaDB-client.x86_64
0:10.0.17-1.el6 MariaDB-compat.x86_64 0:10.0.17-1.el6 galera.x86_64
0:25.3.9-1.rhel6.el6 socat.x86_64 0:1.7.2.3-1.el6
Dependency Installed:
MariaDB-common.x86_64 0:10.0.17-1.el6
17.1.el6
nc.x86_64 0:1.84-22.el6
perl-DBI.x86_64 0:1.609-4.el6
Updated:
rsync.x86_64 0:3.0.6-12.el6
Replaced:
mysql-libs.x86_64 0:5.1.71-1.el6
Complete!

Page 152

11/13
12/13
13/13
1/13
2/13
3/13
4/13
5/13
6/13
7/13
8/13
9/13
10/13
11/13
12/13
13/13

compat-readline5.x86_64 0:5.2nmap.x86_64 2:5.51-4.el6

MySQL Database Administration

versi 1.0 (Maret) 2015

Step 5: Keamanan MariaDB Software


Setelah

proses

installasi

selesai,

lanjutkan

dengan

jalankan

script

/usr/bin/mysql_secure_installation.
Jalankan di kedua node
/usr/bin/mysql_secure_installation

Step 6: Membuat User MariaDB untuk Cluster


Langkah berikutnya yaitu harus membuat beberapa user yang harus dapat
mengakses database. user 'set_user' adalah user yang akan digunakan untuk otentikasi
antar node database untuk melakukan tahap State Transfer Snapshot (SST). Jalankan
perintah berikut pada semua node:
DELETE FROM mysql.user WHERE user='';
GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'redhat';
GRANT USAGE ON *.* to sst_user@'%' IDENTIFIED BY 'redhat';
GRANT ALL PRIVILEGES on *.* to sst_user@'%';
FLUSH PRIVILEGES;

Step 7: Membuat Konfigurasi MariaDB untuk Cluster


Untuk menjalankan MariaDB Cluster ada beberapa konfigurasi yang harus
ditambahkan

pada

file

/etc/my.cnf.d/server.cnf,

menjalankan System Cluster pada MariaDB.

konfigurasi

ini

digunakan

untuk

Adapun konfigurasi tersebut adalah:

Konfigurasi untuk node1:


binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1
query_cache_size=0
query_cache_type=0
bind-address=0.0.0.0
datadir=/var/lib/mysql
innodb_log_file_size=100M
innodb_file_per_table
innodb_flush_log_at_trx_commit=2
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://10.11.12.1,10.11.12.2"
wsrep_cluster_name='galera_cluster'
wsrep_node_address='10.11.12.1'
wsrep_node_name='db1'
wsrep_sst_method=rsync
wsrep_sst_auth=sst_user:redhat

CATATAN PENTING: ketika menjalankan perintah ini pada db2/node2 jangan lupa untuk
menyesuaikan wsrep_node_address dan wsrep_node_name variable.

Page 153

MySQL Database Administration

versi 1.0 (Maret) 2015

Step 8: Menginisialisasi node cluster pertama


Nyalakan MariaDB dengan option '--wsrep-new-cluster', Lakukan pada node db1
untuk mendifine bahwa db1 adalah Master Cluster pertama.
/etc/init.d/mysql start --wsrep-new-cluster

Periksa status dengan menjalankan perintah berikut pada node hanya db1:
[root@mariadb-cluster-node1
'wsrep%'"

~]#

mysql

-uroot

-predhat

-e"show

status

like

+------------------------------+------------------------------------------------+
| Variable_name
| Value
|
+------------------------------+------------------------------------------------+
| wsrep_local_state_uuid
| dc916334-de60-11e4-9afd-37c163596afd
|
| wsrep_protocol_version
| 7
|
| wsrep_last_committed
| 0
|
| wsrep_replicated
| 0
|
>>>>>>>>>>>>>>>> DIPERSINGKAT <<<<<<<<<<<<<<<<<<<<<<
| wsrep_provider_name
| Galera
|
| wsrep_provider_vendor
| Codership Oy <info@codership.com>
|
| wsrep_provider_version
| 25.3.9(r3385)
|
| wsrep_ready
| ON
|
| wsrep_thread_count
| 2
|
+------------------------------+------------------------------------------------+

[root@mariadb-cluster-node1 ~]# mysql -uroot -predhat -e"show status like


'wsrep%'" | grep "wsrep_local_state_comment\|wsrep_incoming_addresses\|
wsrep_cluster_size\|wsrep_ready"
wsrep_local_state_comment
Synced
wsrep_incoming_addresses
10.11.12.1:3306
wsrep_cluster_size
1
wsrep_ready
ON

Penjelasan status:
wsrep_local_state_comment: Synced (cluster berjalan dan bersiap mensinkronisasi)
wsrep_incoming_addresses: 10.11.12.1:3306 (IP Address Cluseter node ini)
wsrep_cluster_size: 1 (Anggota cluster saat ini berjumlah 1 Node)
wsrep_ready: ON (Cluster telah siap)
Step 9: Menginisialisasi node cluster kedua
Jika tidak ada kesalah dalam konfigurasi sebelumnya, untuk mengabungkan node
lainya adalah dengan menyalakan service dari MariaDB, ketik perintah berikut pada db2
[root@mariadb-cluster-node2 ~]# service mysql start
Starting MySQL..SST in progress, setting sleep higher..

OK

setelah berhasil menjalankan service MariaDB pada db2, untuk melihat statusnya dapat
menggunakan perintah berikut:

Page 154

MySQL Database Administration

versi 1.0 (Maret) 2015

[root@mariadb-cluster-node1 ~]# mysql -uroot -predhat -e"show status like


'wsrep%'" | grep "wsrep_local_state_comment\|wsrep_incoming_addresses\|
wsrep_cluster_size\|wsrep_ready"
wsrep_local_state_comment
Synced
wsrep_incoming_addresses
10.11.12.2:3306,10.11.12.1:3306
wsrep_cluster_size
2
wsrep_ready
ON
[root@mariadb-cluster-node2 ~]# mysql -uroot -predhat -e"show status like
'wsrep%'" | grep "wsrep_local_state_comment\|wsrep_incoming_addresses\|
wsrep_cluster_size\|wsrep_ready"
wsrep_local_state_comment
Synced
wsrep_incoming_addresses
10.11.12.2:3306,10.11.12.1:3306
wsrep_cluster_size
2
wsrep_ready
ON

Terlihat dari output perintah di atas saat ini jumlah dari Cluster Node yang bergabung
berjumlah 2 buah, dan pad incoming address sudah bertambah dengan ip address dari
db2, hal tersebut mengidikasikan proses installasi cluster sudah berhasil.
Step 10: Menguji Cluster MariaDB
Sekarang cluster sudah berjalan. Mari kita menguji apakah cluster bekerja dengan
baik atau tidak. Pada db1 buat database 'testcluster' dengan menjalankan perintah berikut:
[root@mariadb-cluster-node1 ~]# mysql -u root -predhat -e 'CREATE DATABASE
clustertest;'

dan pada db2 jalankan perintah di bawah ini untuk menguji kinerja cluster
[root@mariadb-cluster-node2 ~]# mysql -u root -predhat -e 'SHOW DATABASES;'
+--------------------+
| Database
|
+--------------------+
| clustertest
|
| information_schema |
| mysql
|
| performance_schema |
+--------------------+

Jika database clustertest yang dibuat dari db1 muncul juga di db2 hal tersebut
mengindikasikan proses dari konfigurasi cluster sudah berjalan. Untuk lebih memastikan
lagi, kita dapat membuat Table pada database Cluster dan mengisinya dengan informasi.
Untuk memastikan cluster berjalan dengan mode master-master, untuk pembuatan Table
bisa di uji coba pada dari node db2 dan di cek dari node db1 seperti berikut:
[root@mariadb-cluster-node2 ~]# mysql -u root -predhat -e 'CREATE TABLE
clustertest.mycluster ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(50),
ipaddress VARCHAR(20), PRIMARY KEY(id));'
[root@mariadb-cluster-node1 ~]# mysql -u root -predhat -e 'USE clustertest;
SHOW TABLES;'

Page 155

MySQL Database Administration

versi 1.0 (Maret) 2015

+-----------------------+
| Tables_in_clustertest |
+-----------------------+
| mycluster
|
+-----------------------+

Jika node db1 bisa menampilkan table yang baru dibuat hal tersebut mengindikasikan
Cluster model Master-Master telah berhasil di konfigurasi. Testing berikutnya yaitu menguji
penambahan record data.
[root@mariadb-cluster-node1 ~]# mysql -u root -predhat -e 'INSERT INTO
clustertest.mycluster (name, ipaddress) VALUES ("db1", "10.11.12.1");'
[root@mariadb-cluster-node2 ~]# mysql -u root -predhat -e 'USE clustertest;
SELECT * FROM mycluster'
+----+------+------------+
| id | name | ipaddress |
+----+------+------------+
| 2 | db1 | 10.11.12.1 |
+----+------+------------+

Limitasi pada MariaDB Cluster


Berikut adalah limitasi pada MariaDB cluster yang harus kita ketahui
1. Saat ini proses replikasi cluster hanya bekerja untuk model Storage Engine InnoDB.
Semua model penulisan dari tipe lainya, termasuk model system (mysql.*) table
tidak akan di replikasi
2. Penguncian table / database eksplisit yang didukung termasuk LOCK TABLES,
FLUSH

TABLES

{explicit

table

list}

WITH

READ

LOCK,

(GET_LOCK(),

RELEASE_LOCK(),). Menggunakan transaksi yang benar dapat mengatasi


keterbatasan ini. Global locking operators seperti FLUSH TABLES WITH READ LOCK
juga disupport.
3. Semua table minimal harus mempunyai 1 primary key (juga mensupport multicolumn primary keys). DELETE operations tidak disupport pada tables yang tidak
mempunyai primary key.
4. Query log tidak bisa langsung ke dalam table. Jika server mengaktifkan query
logging, log file harus di teruskan ke sebuah file: log_output=nama-file
5. Tidak mendukung XA transactions.
6. Ukuran Transaksi. While Galera does not explicitly limit the transaction size, a

Page 156

MySQL Database Administration

versi 1.0 (Maret) 2015

writeset is processed as a single memory-resident buffer and as a result, extremely


large transactions (e.g. LOAD DATA) may adversely affect node performance. To
avoid that, the wsrep_max_ws_rows and wsrep_max_ws_size system variables
limit transaction rows to 128K and the transaction size to 1Gb by default. If
necessary, users may want to increase those limits. Future versions will add support
for transaction fragmentation.

Pemeriksaan Integritas Cluster


Di Galera Cluster, anda dapat memantau status write-set replikasi seluruh cluster
dengan menggunakan standar query wsrep mmenggunakan mysql klien. Karena semua
variabel statusnya yang berhubungan dengan write-set replikasi diawali oleh wsrep, oleh
sebab itu Anda dapat menampilkan query untuk semuanya.
Untuk menampilkan status dari semua wsrep dapat menjalankan perintah berikut
mysql -uroot -predhat -e"show status like 'wsrep%'"
+------------------------------+--------------------------------------+
| Variable_name
| Value
|
+------------------------------+--------------------------------------+
| wsrep_local_state_uuid
| dc916334-de60-11e4-9afd-37c163596afd |
| wsrep_protocol_version
| 7
|
| wsrep_last_committed
| 3
|
| wsrep_replicated
| 2
|
>>>>>>>>>>>>>>>>>>>>>>>> DIPERSINGKAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<
| wsrep_provider_vendor
| Codership Oy <info@codership.com>
|
| wsrep_provider_version
| 25.3.9(r3385)
|
| wsrep_ready
| ON
|
| wsrep_thread_count
| 2
|
+------------------------------+--------------------------------------+

Untuk memantau perubahan dalam keanggotaan cluster dan status node, Anda dapat
menggunakan perintah Notification.
Pada saat salah satu anggota cluster menerima dan mereplikasi write-sets dari node
lainya atau sebaliknya, berarti cluster anda pada status yang baik. Untuk mengecek
Integritas cluster, untuk setiap node jalankan langkah-langkah berikut:

Page 157

MySQL Database Administration

versi 1.0 (Maret) 2015

Mengecek suatu node adalah bagian dari cluster:


[root@mariadb-cluster-node1 ~]# mysql -uroot -predhat -e"SHOW GLOBAL STATUS
LIKE 'wsrep_cluster_state_uuid';"
+--------------------------+--------------------------------------+
| Variable_name
| Value
|
+--------------------------+--------------------------------------+
| wsrep_cluster_state_uuid | dc916334-de60-11e4-9afd-37c163596afd |
+--------------------------+--------------------------------------+

[root@mariadb-cluster-node2 ~]# mysql -uroot -predhat -e"SHOW GLOBAL STATUS


LIKE 'wsrep_cluster_state_uuid';"
+--------------------------+--------------------------------------+
| Variable_name
| Value
|
+--------------------------+--------------------------------------+
| wsrep_cluster_state_uuid | dc916334-de60-11e4-9afd-37c163596afd |
+--------------------------+--------------------------------------+

Tiap node yang tergabung kedalam cluster akan memberikan Value yang sama. Jika anda
mendapatkan salah satu node mengeluarkan Value yang berbeda, hal tersebut
mengindikasikan bahwa node tersebut tidak ter-join ke cluster.
Memeriksa node milik komponen cluster yang sama:
[root@mariadb-cluster-node1 ~]# mysql -uroot -predhat -e"SHOW GLOBAL STATUS
LIKE 'wsrep_cluster_conf_id'"
+-----------------------+-------+
| Variable_name
| Value |
+-----------------------+-------+
| wsrep_cluster_conf_id | 4
|
+-----------------------+-------+
[root@mariadb-cluster-node2 ~]# mysql -uroot -predhat -e"SHOW GLOBAL STATUS
LIKE 'wsrep_cluster_conf_id'"
+-----------------------+-------+
| Variable_name
| Value |
+-----------------------+-------+
| wsrep_cluster_conf_id | 4
|
+-----------------------+-------+

Tiap node yang tergabung kedalam cluster akan memberikan Value yang sama. Jika anda
mendapatkan salah satu node mengeluarkan Value yang berbeda, hal tersebut
mengidikasikan cluster tersebut dalam kondisi terbagi-bagi (partioned). Biasanya
permasalahnya ada pada koneksi antar Node cluster, jika koneksi sudah diperbaiki,
nilainya akan kembali sama secara otomatis.
Pada node pertama, check jumlah node yang tergabung kedalam cluster dengan
menggunaka perintah berikut:
[root@mariadb-cluster-node1 ~]# mysql -uroot -predhat -e"SHOW GLOBAL STATUS

Page 158

MySQL Database Administration

versi 1.0 (Maret) 2015

LIKE 'wsrep_cluster_size';"
+--------------------+-------+
| Variable_name
| Value |
+--------------------+-------+
| wsrep_cluster_size | 2
|
+--------------------+-------+
[root@mariadb-cluster-node2 ~]# mysql -uroot -predhat -e"SHOW GLOBAL STATUS
LIKE 'wsrep_cluster_size';"
+--------------------+-------+
| Variable_name
| Value |
+--------------------+-------+
| wsrep_cluster_size | 2
|
+--------------------+-------+

Jika Value yang dihasilkan sama, mengindikasikan semua node sudah dengan baik
tergabung kedalam cluster.
Periksa primary status dari komponen cluster
[root@mariadb-cluster-node1 ~]# mysql -uroot -predhat -e"SHOW GLOBAL STATUS
LIKE 'wsrep_cluster_status';"
+----------------------+---------+
| Variable_name
| Value
|
+----------------------+---------+
| wsrep_cluster_status | Primary |
+----------------------+---------+
[root@mariadb-cluster-node2 ~]# mysql -uroot -predhat -e"SHOW GLOBAL STATUS
LIKE 'wsrep_cluster_status';"
+----------------------+---------+
| Variable_name
| Value
|
+----------------------+---------+
| wsrep_cluster_status | Primary |
+----------------------+---------+

Memeriska Perfoma Anggota Cluster


Pengaturan kontrol flow akan menghasilkan jeda yang mengatur kapan
wsrep_local_recv_queue melebihi ambang batas. Pemantauan variabel-variabel berikut
akan memberikan pemahaman tentang panjang wsrep_local_recv_queue selama periode
antara pemeriksaan Status:
wsrep_local_recv_queue_avg
wsrep_local_recv_queue_max
wsrep_local_recv_queue_min
Untuk memeriksa kesehatan replikasi, lakukan langkah-langkah berikut:

Page 159

MySQL Database Administration

versi 1.0 (Maret) 2015

Menemukan Penuruman Perfoma Pada Slave:


[root@mariadb-cluster-node2 ~]# mysql -uroot -predhat -e"SHOW
STATUS LIKE 'wsrep_flow_control_paused';"
+---------------------------+----------+
| Variable_name
| Value
|
+---------------------------+----------+
| wsrep_flow_control_paused | 0.000000 |
+---------------------------+----------+
Jika jarak dari Value antara 0.0 dan 1.0, Hal ini menunjukkan sebagian kecil dari waktu
replikasi itu terhenti semenjak perintah STATUS ini ditampilkan. Jika Valuenya adalah 1.0
mengidikasikan proses replikasi benar-benar berhenti. Kita harus menjaga sebisa mungkin
nilai dari Value agar tetap mendekati 0.0.
Cara satu-satunya untuk mengingkatkan value ini adalah dengan meningkatkan
wsrep_slave_threads parameter dan menlepas keangotaan node tersebut untuk
diperbaiki.
Menentukan jarak rata-rata antara nilai terendah dan tertinggi dari Value seqno
[root@mariadb-cluster-node2 ~]# mysql -uroot -predhat -e"SHOW STATUS LIKE
'wsrep_cert_deps_distance';"
+--------------------------+----------+
| Variable_name
| Value
|
+--------------------------+----------+
| wsrep_cert_deps_distance | 1.000000 |
+--------------------------+----------+

Hal Ini memberikan nilai rata-rata berapa banyak transaksi yang dapat diterapkan secara
bersamaan dalam satu waktu.
Memeriksa Perfoma Jaringan Yang Lambat
Jika Anda memiliki jaringan yang lambat atau jaringan sedang terdapat gangguan,
periksa nilai variabel di bawah ini:
wsrep_local_send_queue_avg
wsrep_local_send_queue_max
wsrep_local_send_queue_min
Untuk menentukan apakah Anda memiliki permasalahan jaringan, jalankan query berikut:
[root@mariadb-cluster-node2 ~]# mysql -uroot
'wsrep_local_send_queue_avg';"
+----------------------------+----------+
| Variable_name
| Value
|
+----------------------------+----------+
| wsrep_local_send_queue_avg | 0.000000 |

Page 160

-predhat

-e"SHOW

STATUS

LIKE

MySQL Database Administration

versi 1.0 (Maret) 2015

+----------------------------+----------+

Nilai tinggi dapat menunjukkan gangguan pada link jaringan. Jika hal ini terjadi,
penyebabnya bisa berada di setiap lapisan, dari komponen fisik untuk konfigurasi sistem
operasi.

Page 161

MySQL Database Administration

versi 1.0 (Maret) 2015

-= SEKIAN =-

Page 162

Anda mungkin juga menyukai