MYSQL-Module MySQL-MariaDB FundamentalAndAdvanced PDF
MYSQL-Module MySQL-MariaDB FundamentalAndAdvanced PDF
0 (Maret) 2015
MySQL Database
Administration Fundamental
and Advanced
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
===================================================================
MySQL Administration Advanced
===================================================================
MySQL METADATA.........................................................................................................107
Bab 12. Memanfaatkan MySQL Metadata
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.
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
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
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 :
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).
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
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
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
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.
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
Page 15
MySQL Database Administration versi 1.0 (Maret) 2015
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
Page 18
MySQL Database Administration versi 1.0 (Maret) 2015
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
3. PHPMyAdmin
Page 20
MySQL Database Administration versi 1.0 (Maret) 2015
Page 21
MySQL Database Administration versi 1.0 (Maret) 2015
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
Page 22
MySQL Database Administration versi 1.0 (Maret) 2015
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.
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.
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.
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
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
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
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.
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
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 Database
Sintaks umum SQL untuk membuat suatu database adalah sebagai berikut :
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 :
Jika query di atas berhasil dieksekusi dan database berhasil dibuat, maka akan
ditampilkan pesan kurang lebih sebagai berikut :
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
+--------------+
| 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 :
Page 35
MySQL Database Administration versi 1.0 (Maret) 2015
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 :
Jika query untuk membuat tabel di atas berhasil dijalankan, maka akan ditampilkan pesan
sebagai berikut :
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.
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 :
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 :
Contohnya kita akan menghapus tabel dengan nama pelanggan maka perintah SQL-nya
adalah :
Page 39
MySQL Database Administration versi 1.0 (Maret) 2015
Bentuk umum perintah SQL untuk menambahkan record atau data ke dalam
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 :
Jika perintah SQL di atas berhasil dieksekusi maka akan ditampilkan pesan sebagai
berikut :
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
Page 40
MySQL Database Administration versi 1.0 (Maret) 2015
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 :
Dan jika query di atas berhasil dieksekusi maka akan ditampilkan hasil sebagai
berikut :
Page 41
MySQL Database Administration versi 1.0 (Maret) 2015
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 :
Perhatikan beberapa contoh perintah DELETE dari tabel pelanggan berikut ini !
1. Menghapus data pelanggan yang mempunyai id_pelanggan P0002
Dan jika query di atas berhasil dieksekusi dan record yang akan dihapus ada, maka
akan ditampilkan hasil sebagai berikut :
Page 42
MySQL Database Administration versi 1.0 (Maret) 2015
Perhatikan beberapa contoh perintah SELECT dari tabel pelanggan berikut ini !
1. Menampilkan seluruh data atau record (*) dari tabel 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)
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
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
+--------------+------------------+----------------------------+
| id_pelanggan | nm_pelanggan | email |
+--------------+------------------+----------------------------+
| P0001 | Yusuf Hadiwinata | yusuf.hadiwinata@gmail.com |
+--------------+------------------+----------------------------+
1 row in set (0.02 sec)
+--------------+--------------+---------------+---------------+
| 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)
+--------------+------------------+
| id_pelanggan | nm_pelanggan |
+--------------+------------------+
| P0004 | Ninda Budianto |
| P0005 | Rea |
| P0003 | Winny |
| P0002 | Yoga Rimaldo |
| P0001 | Yusuf Hadiwinata |
+--------------+------------------+
5 rows in set (0.00 sec)
+--------------+------------------+
| id_pelanggan | nm_pelanggan |
+--------------+------------------+
| P0001 | Yusuf Hadiwinata |
| P0002 | Yoga Rimaldo |
| P0003 | Winny |
| P0005 | Rea |
| P0004 | Ninda Budianto |
+--------------+------------------+
5 rows in set (0.00 sec)
Page 45
MySQL Database Administration versi 1.0 (Maret) 2015
+--------------+----------------+
| 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
+----------+
| 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.
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)
Hasil keluarannya:
Page 47
MySQL Database Administration versi 1.0 (Maret) 2015
Hasil keluarannya:
Budi
LENGTH (string)
OCTET_LENGTH (string)
CHAR_LENGTH (string)
CHARACTER_LENGTH (string)
Fungsi ini digunakan untuk menghitung panjang suatu string. Contoh:
Hasil keluarannya:
Hasil keluarannya:
Budi
Page 48
MySQL Database Administration versi 1.0 (Maret) 2015
karakter. Contoh:
Hasil keluarannya:
Uhur
LTRIM (string)
Fungsi ini digunakan untuk menghilangkan spasi di awal string (kiri).
Contoh:
Hasil keluarannya:
Budi Luhur
RTRIM (string)
Fungsi ini digunakan untuk menghilangkan spasi di akhir string (kanan).
Contoh:
Hasil keluarannya:
Budi Luhur
TRIM (string)
Fungsi ini digunakan untuk menghilangkan spasi di awal dan akhir string (kiri dan
kanan). Contoh:
Hasil keluarannya:
Budi Luhur
Page 49
MySQL Database Administration versi 1.0 (Maret) 2015
Contoh:
Hasil keluarannya:
xxx.mysql.com
Hasil keluarannya:
MontMontMont
REVERSE (string)
Fungsi ini digunakan untuk membalik string. Contoh:
Hasil keluarannya:
moc.lqsym
LCASE (string)
LOWER (string)
Fungsi ini digunakan untuk mengubah string menjadi huruf kecil (lower- case).
Contoh:
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:
Hasil keluarannya:
MYSQL
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:
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
Hasil keluarannya:
22
YEAR (tanggal)
Fungsi ini digunakan untuk mendapatkan bilangan tahun dari suatu tanggal yang
diberikan. Contoh:
Hasil keluarannya:
2015
HOUR (waktu)
Fungsi ini digunakan untuk mendapatkan bilangan jam dari suatu parameter waktu
yang diberikan. Contoh:
Hasil keluarannya:
20
MINUTE (waktu)
Fungsi ini digunakan untuk mendapatkan bilangan menit dari suatu parameter
waktu yang diberikan. Contoh:
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:
Hasil keluarannya:
53
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
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:
Hasil keluarannya:
10.36
POW(x)
POWER(x, n)
Page 55
MySQL Database Administration versi 1.0 (Maret) 2015
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:
Hasil keluarannya:
10.2
Fungsi Lainnya
Selain fungsi yang berhubungan dengan string, date-and-time, dan numerik MySQL
juga memiliki fungsi-fungsi khusus, diantaranya :
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:
Hasil keluarannya:
MAX(range)
Fungsi digunakan untuk mengambil nilai terbesar dari suatu ekspresi (query).
Contoh:
Hasil keluarannya:
93
MIN(range)
Fungsi digunakan untuk mengambil nilai terkecil dari suatu ekspresi (query).
Contoh:
Hasil keluarannya:
40
SUM(range)
Fungsi digunakan untuk menjumlahkan total nilai dari suatu ekspresi (query).
Contoh:
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:
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:
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:
Hasil keluarannya:
Page 59
MySQL Database Administration versi 1.0 (Maret) 2015
Qwerty
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
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:
Page 62
MySQL Database Administration versi 1.0 (Maret) 2015
Page 63
MySQL Database Administration versi 1.0 (Maret) 2015
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
Berikut ini perintah SQL untuk menggabungkan tabel pelanggan dan pesan:
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.
Berikut ini perintah SQL untuk menggabungkan tabel pelanggan dan pesan:
Page 65
MySQL Database Administration versi 1.0 (Maret) 2015
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
Berikut ini perintah SQL untuk menggabungkan tabel pelanggan dan pesan:
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
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
Berikut ini perintah SQL untuk menggabungkan tabel pelanggan dan pesan:
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.
Page 67
MySQL Database Administration versi 1.0 (Maret) 2015
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)
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
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:
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.
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:
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:
+----------+--------+
| id_pesan | jumlah |
+----------+--------+
| 1 | 3 |
+----------+--------+
1 row in set (0.00 sec)
Page 70
MySQL Database Administration versi 1.0 (Maret) 2015
SubSELECT
Dan berikut ini beberapa contoh perintah query yang menggunakan SubSELECT.
+--------------+------------------+
| id_pelanggan | nm_pelanggan |
+--------------+------------------+
| P0001 | Yusuf Hadiwinata |
| P0002 | Yoga Rimaldo |
| P0004 | Ninda Budianto |
+--------------+------------------+
3 rows in set (0.01 sec)
Hasilnya:
+----------+--------+
| id_pesan | jumlah |
+----------+--------+
| 1 | 3 |
+----------+--------+
1 row in set (0.00 sec)
Page 71
MySQL Database Administration versi 1.0 (Maret) 2015
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):
+--------------+------------------+----------------------------+
| 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 :
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).
Page 74
MySQL Database Administration versi 1.0 (Maret) 2015
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
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.
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:
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
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.
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.
Menambahkan user baru dengan nama user admin, hanya dapat mengakses
database mysql, hanya dapat mengakses dari komputer localhost dan dengan
password qwerty.
Berikut ini beberapa contoh mengatur hak akses user yang sudah ada di MySQL:
Mengubah hak akses user adinda agar dapat mengakses database penjualan.
Mengubah hak akses user admin agar dapat CREATE di database penjualan.
Page 80
MySQL Database Administration versi 1.0 (Maret) 2015
Untuk menghapus hak akses user, dapat dilakukan dengan perintah REVOKE.
Berikut ini contohnya:
Menghapus hak akses user admin terhadap database penjualan.
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:
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.
dimana
BEFORE | AFTER digunakan untuk menentukan kapan proses secara otomatis akan
Page 82
MySQL Database Administration versi 1.0 (Maret) 2015
DELIMITER $$
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.
Contoh :
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.
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.
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.
+--------------+------------------+--------------+
| 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.
+----------+------------+--------------+------------------+--------+
| 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]
+--------------+------------------+-----------------+--------------+----------------------------+
| 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.
Contoh :
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();
+--------------+
| Hello World! |
+--------------+
| Hello World! |
+--------------+
1 row in set (0.02 sec)
Page 88
MySQL Database Administration versi 1.0 (Maret) 2015
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
DELIMITER $$
CREATE PROCEDURE jumlahPelanggan()
BEGIN
SELECT COUNT(*) FROM pelanggan;
END$$
DELIMITER ;
+----------+
| COUNT(*) |
+----------+
| 4 |
+----------+
1 row in set (0.00 sec)
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
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:
Page 90
MySQL Database Administration versi 1.0 (Maret) 2015
Menghapus SP
Untuk menghapus SP yang sudah ada, berikut ini bentuk umumnya:
Atau
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:
Contohnya:
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:
Contohnya:
Page 91
MySQL Database Administration versi 1.0 (Maret) 2015
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;
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
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]
Page 93
MySQL Database Administration versi 1.0 (Maret) 2015
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
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).
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.
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
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.
Page 99
MySQL Database Administration versi 1.0 (Maret) 2015
Contoh misalnya kita akan melakukan backup semua database, sintaksnya sebagai
berikut:
Jika ingin membakup salah satu database saja bisa menggunakan perintah seperti
dibawah ini:
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
Untuk merestore single database backup bisa menggunakan format dibawah ini:
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:
Page 102
MySQL Database Administration versi 1.0 (Maret) 2015
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.
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.
<?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:
Koneksi Sukses
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";
?>
<?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
// 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();
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');
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>
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
<?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
?>
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
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";
}
?>
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
#!/usr/bin/perl
use strict;
use DBI;
my @ary = DBI->available_drivers();
print join("\n", @ary), "\n";
perl nama-script.extension
Contoh outputnya:
DBM
ExampleP
File
Gofer
Proxy
Sponge
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 $@;
Page 117
MySQL Database Administration versi 1.0 (Maret) 2015
agar dapat menggunakan interpreter DBI, kita harus meninstall DBI Per module, perintah
yang dapat digunakan untuk menginstall Perl DBI module adalah:
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
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:
Page 121
MySQL Database Administration versi 1.0 (Maret) 2015
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
Page 122
MySQL Database Administration versi 1.0 (Maret) 2015
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:
Untuk melihat Storage engine yang digunakan pada table dapat menggunakan perintah
seperti di bawah ini:
Hasilnya:
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)
Page 124
MySQL Database Administration versi 1.0 (Maret) 2015
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)
Page 125
MySQL Database Administration versi 1.0 (Maret) 2015
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)
Page 126
MySQL Database Administration versi 1.0 (Maret) 2015
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).
Page 127
MySQL Database Administration versi 1.0 (Maret) 2015
Page 128
MySQL Database Administration versi 1.0 (Maret) 2015
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.
Page 129
MySQL Database Administration versi 1.0 (Maret) 2015
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;
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.
Page 132
MySQL Database Administration versi 1.0 (Maret) 2015
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.
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.
Execution plan mengkonfirmasikan bahwa mysql melakukan full table scan dari row
pertama sampai row terakhir, padahal kita hanya menginginkan satu row saja.
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)
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
Sekarang test menggunakan query searching, dan hasilnya muncul sangat cepat, hanya
0.05 detik.
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
Page 136
MySQL Database Administration versi 1.0 (Maret) 2015
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)
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)
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 TABLES;
+----------------+
| Tables_in_test |
+----------------+
| sorttest |
Page 138
MySQL Database Administration versi 1.0 (Maret) 2015
+----------------+
#!/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
#!/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)
Page 140
MySQL Database Administration versi 1.0 (Maret) 2015
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)
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)
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)
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.
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.
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl
Page 142
MySQL Database Administration versi 1.0 (Maret) 2015
perl mysqltuner.pl
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
wget https://launchpadlibrarian.net/78745738/tuning-primer.sh
./tuning-primer.sh
Replace ? [y/N] : y
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
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
Note! This script will still suggest raising the join_buffer_size when
ANY joins not using indexes are found.
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.
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.
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.
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
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
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
Page 150
MySQL Database Administration versi 1.0 (Maret) 2015
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
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.0/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
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
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
/usr/bin/mysql_secure_installation
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
Periksa status dengan menjalankan perintah berikut pada node hanya db1:
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)
setelah berhasil menjalankan service MariaDB pada db2, untuk melihat statusnya dapat
menggunakan perintah berikut:
Page 154
MySQL Database Administration versi 1.0 (Maret) 2015
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.
dan pada db2 jalankan perintah di bawah ini untuk menguji kinerja cluster
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:
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.
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
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
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
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.
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:
Page 158
MySQL Database Administration versi 1.0 (Maret) 2015
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.
wsrep_local_recv_queue_avg
wsrep_local_recv_queue_max
wsrep_local_recv_queue_min
Page 159
MySQL Database Administration versi 1.0 (Maret) 2015
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
Hal Ini memberikan nilai rata-rata berapa banyak transaksi yang dapat diterapkan secara
bersamaan dalam satu waktu.
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:
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