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 versi 1.0 (Maret) 2015

7. Keamanan. MariaDB 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 masing-
masing, 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
1 id_pelanggan * Varchar 5
2 nm_pelanggan Varchar 30
3 alamat Text -
4 telepon Varchar 20
5 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:

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:

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:

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:

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:

COUNT(range)
Fungsi digunakan untuk mengambil jumlah baris dari suatu query. Contoh:

SELECT COUNT(*) FROM pelanggan;

Hasil keluarannya:

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:

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-and-
roolback). 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 barang-
barang 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 ... WHERE col=[ANY|ALL] (SELECT ...);


SELECT ... WHERE col [NOT] IN (SELECT ...);
SELECT ROW(val1,val2,..) =[ANY] (SELECT col1,col2,..);
SELECT ... WHERE col = [NOT] EXISTS (SELECT ...);
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. Masing-
masing 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-and-
write). 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 (nested-
transaction), 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 FILE RELOAD


ALTER INDEX SELECT
CREATE INSERT SHUTDOWN
DELETE PROCESS UPDATE
DROP REFERENCES 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 bentuk-
bentuk 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 (table-
data) 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 meng-
copy 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 data tabel
pelanggan dan memasukkan nya ke variabel query
$no=1;
//membuat nomor pada tabel

Page 112
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 database standar. DBI juga bertanggung jawab atas
pembebanan dinamis driver, pengecekan error 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 indeks-
indeks 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 256TB RAM 64TB None 384EB
Transactions No No Yes No Yes
Locking granularity Table Table Row Table Row
MVCC No No Yes No No
Geospatial data type support Yes No Yes Yes Yes
Geospatial indexing support Yes No Yes No No
B-tree indexes Yes Yes Yes No No
T-tree indexes No No No No Yes
Hash indexes No Yes No No Yes
Full-text search indexes Yes No Yes No No
Clustered indexes No No Yes No No
Data caches No N/A Yes No Yes
Index caches Yes N/A Yes No Yes
Compressed data Yes No Yes Yes No
Encrypted data Yes Yes Yes Yes Yes
Cluster database support No No No No Yes
Replication support Yes Yes Yes Yes Yes
Foreign key support No No Yes No No
Backup / point-in-time recovery Yes Yes Yes Yes Yes
Query cache support Yes Yes Yes Yes Yes
Update statistics for data dictionary Yes Yes 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 contoh, memungkinkan untuk

Page 124
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 | PRI | 0 | |
| col2 | char(30) | YES | | 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 cross-
reference 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 baik-
baik 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 TABLE big_table AS


select @baris := @baris+1 as baris
from ( select @baris := 0 ) x
join ( select 1 kolom from information_schema.tables ) a
join ( select 1 kolom from information_schema.tables ) b
join ( 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 |
+---------+
| 1 |
| 2 |
. . . . . .
| 1191016 |
+---------+
1191016 rows in set (0.05 sec)

SELECT * FROM big_table WHERE baris = 5346781 ;


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

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' test -e "insert into sorttest value
('$UUID');"
let "COUNT=COUNT+1"
done

SELECT count(*) FROM sorttest;


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

Setelah 100k 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 10.11.12.1 db1 >> /etc/hosts


echo 10.11.12.2 db2 >> /etc/hosts
ping db1
ping db2

Dilanjutkan dengan menkonfigurasi NTP Server

echo server 0.centos.pool.ntp.org iburst >> /etc/ntp.conf


echo server 1.centos.pool.ntp.org iburst >> /etc/ntp.conf
echo server 2.centos.pool.ntp.org iburst >> /etc/ntp.conf
echo server 3.centos.pool.ntp.org iburst >> /etc/ntp.conf
service ntpd restart
Shutting down ntpd: [ OK ]
Starting ntpd: [ OK ]

Page 150
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 --port 3306:tcp


sudo lokkit --port 4444:tcp
sudo lokkit --port 4567:tcp
sudo lokkit --port 4568:tcp
iptables -A INPUT -p tcp dport 3306 -j ACCEPT
iptables -A INPUT -p tcp dport 4444 -j ACCEPT
iptables -A INPUT -p tcp dport 4567 -j ACCEPT
iptables -A INPUT -p tcp dport 4568 -j 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 11/13
Erasing : mysql-libs-5.1.71-1.el6.x86_64 12/13
Cleanup : rsync-3.0.6-9.el6_4.1.x86_64 13/13
Verifying : galera-25.3.9-1.rhel6.el6.x86_64 1/13
Verifying : 2:nmap-5.51-4.el6.x86_64 2/13
Verifying : nc-1.84-22.el6.x86_64 3/13
Verifying : rsync-3.0.6-12.el6.x86_64 4/13
Verifying : compat-readline5-5.2-17.1.el6.x86_64 5/13
Verifying : MariaDB-common-10.0.17-1.el6.x86_64 6/13
Verifying : perl-DBI-1.609-4.el6.x86_64 7/13
Verifying : socat-1.7.2.3-1.el6.x86_64 8/13
Verifying : MariaDB-Galera-server-10.0.17-1.el6.x86_64 9/13
Verifying : MariaDB-compat-10.0.17-1.el6.x86_64 10/13
Verifying : MariaDB-client-10.0.17-1.el6.x86_64 11/13
Verifying : rsync-3.0.6-9.el6_4.1.x86_64 12/13
Verifying : mysql-libs-5.1.71-1.el6.x86_64 13/13
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 compat-readline5.x86_64 0:5.2-
17.1.el6 nc.x86_64 0:1.84-22.el6 nmap.x86_64 2:5.51-4.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
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, konfigurasi ini digunakan untuk
menjalankan System Cluster pada MariaDB. 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 ~]# 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 | 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 multi-
column 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 -predhat -e"SHOW STATUS LIKE


'wsrep_local_send_queue_avg';"
+----------------------------+----------+
| Variable_name | Value |
+----------------------------+----------+
| wsrep_local_send_queue_avg | 0.000000 |

Page 160
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