IGOS Training Tool Kit “RDBMS (Relational DataBase Management System): MySQL”
I. Pengantar RDBMS
1.1 Pendahuluan SQL(Structured Query Language) adalah bahasa query yang standard yang digunakan sebagai suatu bahasa sederhana dan dasar, yang memungkinkan Anda untuk berkomunikasi dengan database, membaca, menulis, dan memperoleh informasi yang berguna dari database. Meskipun sifatnya nonprocedural, lebih mudah bekerja dengan SQL daripada dengan kebanyakan bahasa pemrograman seperti PHP, PERL, Java dan lain lain, namun kadangkala menyulitkan untuk beberapa kasus yang rumit bagi mereka yang baru mengenal SQL. Perintah atau statement SQL yang paling sederhana yang memungkinkan seorang user dapat menampilkan atau memperoleh data dari suatu tabel adalah perintah atau statement SELECT. Sesuai dengan namanya, dengan perintah SELECT seorang user dapat memilih data yang spesifik dari tabel untuk menampilkannya. Dengan mengasumsikan bahwa tabel dalam database Anda memiliki nama tabel 'mahasiswa', dengan struktur tabel sebagai berikut:
Kemudian Anda jalankan query seperti ini: mysql> select * from mahasiswa;
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 1
1.2 SQL92 SQL telah distandarisasi, dan versi saat ini mengacu pada SQL92. Beberapa database yang mendukung SQL seharusnya menyesuaikan dengan standard SQL saat ini. Standarisasi SQL telah mejadikan SQL sebagai perangkat atau tool istimewa yang digunakan dalam pengembangan dan desain web. Sebagian besar program atau software untuk pengembangan aplikasi web, terutama Allaire's Cold Fusion dan Macromedia Dreamweaver Ultradev, mengandalkan pada SQL atau perintahperintah SQL untuk menghubungkan dan memperoleh informasi dari database. Untuk informasi lebih detil tentang SQL92, kunjungi : http://developer.mimer.se/documentation/html_82/Mimer_SQL_Reference_Manual/Intro_S QL_Stds3.html
1.3 Relational Databases 1.3.1 Relational vs. flat file databases Flat flie database adalah suatu database yang didesain menyertakan suatu tabel tunggal. Flat file database meletakkan seluruh data kedalam tabel tunggal, atau daftar, dengan kolomkolom yang merepresentasikan seluruh parameter. Sebuah flat file bisa terdiri dari banyak kolom, seringkali dengan duplikasi data yang cenderung menyebabkan kerusakan data (data corruption). Jika Anda memutuskan untuk menggabungkan data diantara dua flat file, maka Anda harus melakukan copy dan paste informasi yang relevan dari satu file ke file yang lainnya. Disini tidak ada otomatisasi diantara dua flat file. Jika Anda memiliki dua atau lebih flat file yang berisi data alamat klien, sebagai contoh, klien telah berpindah alamat, maka Anda harus merubah secara manual alamat klien tersebut yang ada dalam setiap flat file. Perubahan informasi dalam satu file tidak memiliki sangkut paut dengan file lainnya. Flat file menawarkan fungsionalitas untuk menyimpan informasi, memanipulasi kolomkolom, mencetak dan menampilkan informasi yang terformat, pertukaran informasi dengan orang lain melalui email dan melalui internet. Beberapa flat file bisa dikerjakan pada filefile eksternal, seperti text editor, agar memperluas fungsionalitas dan mengatur informasi yang berhubungan.
2 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
Dilain pihak, suatu Relational database, menggabungkan tabeltabel dengan berbagai metode untuk dapat berkerjasama. Hubunganhubungan antar tabel data dapat dibandingkan, disatukan, dan ditampilkan dalam formform database. Sebagian besar relational database menawarkan fungsionalitas untuk berbagi (share) data:
melalui jaringan
melalui internet
dengan laptop dan perangkat elektronik lainnya seperti palm pilots
Dengan softwaresoftware system yang lain
Mendesain flat file database adalah sederhana, dan memerlukan sedikit pengetahuan desain database. Flat file dapat dikembangkan dengan hanya menggunakan satu database engine. Flat file dapat dibuat dalam relational database engine dengan tidak mengambil manfaat atau keuntungan dari konsepkonsep desain relasional. Mendesain suatu relational database memerlukan perencanaan yang lebih dari pada flat file database. Dengan flat file, menambah informasi sepertinya perlu dipertimbangkan. Dengan relational database, dapat menyimpan data kedalam tabeltabel sedemikian rupa sehingga hubungan antar tabel dapat dimengerti. Membangun suatu relational database sangat tergantung pada kemampuan Anda untuk menetapkan suatu model relasional. Model harus benarbenar menggambarkan penuh bagaimana data diorganisir dalam ketentuan struktur data, intergriti, query, manipulasi, dan penyimpanan. Relational database memungkinkan useruser untuk mendefinisikan kolomkolom record tertentu sebagai key atau index, melakukan pencarian, menghubungkan recordrecord antar tabel dan menetapkan batasanbatasan integritas. Queryquery pencarian lebih cepat dan lebih akurat jika berdasarkan nilainilai yang telah diindex. Recordrecord tabel dapat dengan mudah dihubungkan dengan nilainilai yang telah diindex. Batasanbatasan integritas dapat ditetapkan untuk menjamin bahwa hubungan antar tabel tersebut syah. Jika Anda dapat membuat sebuah hubungan satukebanyak (onetomany) dalam tabeltabel data Anda , sebaiknya Anda menggunakan relational database karena flat file tidak cukup untuk menangani seluruh pemrosesan data yang Anda butuhkan. Relational database menawarkan proses reporting yang lebih baik, dengan berbagai report generator yang memfilter dan menampilkan kolomkolom pilihan. Relational database menawarkan kemampuan membuat modulemodule reporting Anda sendiri. Sebagian besar relational database juga menawarkan kemampuan mengimpor dan mengekspor data dari software lainnya.
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 3
Terdapat tiga sistem relational database yang utama: proprietary, open source, dan embedded. Relational database yang proprietary biasanya memerlukan penggunaan bahasabahasa pengembangan yang juga bersifat proprietary guna menyempurnakan SQL. Sebagai contoh MS Access yang menggabungkan visual basic dengan SQL. Database database open source, seperti MySQL, didistribusikan dengan gratis agar mendorong pengembangan user. Embedded dan relational database dikemas sebagai bagian dari paket paket software lainnya, seperti paketpaket software taxpreparation. Vendor mensuplai database, dan seluruh perlengkapanperlengkapan manipulasi yang berhubungan, untuk mengontrol struktur database. Databasedatabase ini biasanya disertakan oleh perlengkapanperlengkapan yang mana menyediakan audit bekasbekas transaksi.
1.3.2 Normalisasi database Jika Anda bekerja dengan database, maka Anda harus familiar dengan istilah “normalisasi”. Mungkin orang sering bertanya kepada Anda, “apakah databasenya sudah dinormalisasi ?” atau, “apakah databasenya dalam BCNF ?” . Namun dengan mengetahui prinsipprinsip dari normalisasi, dan dengan menerapkannya pada tugastugas desain database Anda maka semuanya itu bukanlah hal yang sulit, dan dapat meningkatkan performa DBMS Anda. Normalisasi adalah suatu proses mengefisiensikan pengorganisasian data dalam suatu database. Ada dua tujuan dari proses normalisasi:
Untuk mengeliminasi atau menghilangkan duplikasi data (menyimpan data yang sama kedalam lebih dari satu tabel) Untuk menjamin bahwa ketergantungan data dapat dimengerti atau masuk akal (hanya menyimpan data yang berhubungan dalam suatu tabel)
Kedua tujuan normalisasi tersebut mengurangi jumlah konsumsi space database, dan menjamin bahwa data secara logika disimpan. Komunitas database telah mengembangkan petunjukpetunjuk untuk menjamin bahwa database dinormalisasi. Itu semua diacu sebagai bentukbentuk normal atau Nornal Forms (NF) dan serangkain petunjuk tersebut diberi nomor dari nomor satu (bentuk normalisasi yang paling rendah) sampai nomor lima (bentuk normal kelima atau 5NF). Dalam aplikasi aplikasi praktis, Anda akan sering menemukan 1NF, 2Nf, dan 3NF kadang bersama dengan 4 NF. Bentuk normal kelima sangat jarang ditemukan. Bentuk normal kesatu (1NF) menentukan aturantauran yang paling dasar untuk suatu pengaturan database: ● ●
Menghilangkan duplikasi kolomkolom dalam tabel yang sama Membuat tabel terpisah untuk setiap grup data yang berhubungan dan mengidentifikasi setiap baris dengan suatu kolom yang unik atau sekumpulan
4 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
kolom yang unik (primary key) Bentuk normal kedua (2NF) selanjutnya memusatkan perhatian pada konsep menghilangkan duplikasi data: ● ●
●
Menemukan semua syaratsyarat bentuk normal kesatu Hilangkan subset data yang diterapkan pada beberapa baris dari sebuah tabel dan letakkan kedalam tabel terpisah Buatlah relasi antara tabeltabel baru dan tabeltabel pendahulunya melalui penggunaan Foreign Keys
Bentuk normal ketiga (3NF) melakukan satu langkah besar selanjutnya: ● ●
Menemukan semua syaratsyarat bentuk normal kedua Menghilangkan kolomkolom yang tidak secara langsung tergantung pada primary key
Terakhir, bentuk normal keempat (4NF) memiliki satu syarat tambahan: ● ●
Menemukan semua syaratsyarat bentuk normal ketiga Suatu relasi adalah dalam bentuk normal keempat (4NF) jika relasi itu tidak memiliki ketergantungan banyak nilai (value)
Ingat, petunjuk normalisasi ini adalah bersifat komulatif. Untuk suatu database menjadi bentuk normal kedua (2NF), pertama harus terpenuhi dahulu seluruh kriteria bentuk normal kesatu (1NF).
1.3.3 Relasi Antar Tabel Selain Anda mengetahui bentuk normal hal lain yang perlu Anda pahami adalah tipetipe relasi antar tabel. Tipe relasi amat penting untuk menjaga keutuhan Database Anda. Ringkasnya ada 3 tipe relasi yaitu relasi satukesatu, relasi satukebanyak dan relasi banyakkebanyak. 1.3.3.1 Relasi satukebanyak (OnetoMany) Relasi disebut relasi satu ke banyak apabila satu nilai pada sebuah kolom merujuk ke dua atau lebih kolom pada tabel yang lain, contoh sebagai berikut : Tabel A : perusahaan_ienisusaha id_perusahaan
nama_perusahaan
id_jenis
1
Astra
1
2
Festo
1
3
TNT
3
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 5
4
Nurul Fikri Cipta Inovasi
2
5
HAFANA
2
6
Telkom
3
Tabel B : jenisusaha id_jenis
nama_jenis
1
Manufaktur
2
Teknologi Informasi
3
Telekomunikasi
Perhatikan bahwa id_jenis pada tabel perusahaan_jenisusaha merujuk pada id_jenis pada tabel jenisusaha untuk mengetahui atau memperoleh nama jenis usaha (nama_jenis). 1.3.3.2 Relasi satukesatu (OnetoOne) Relasi satukesatu terjadi apabila satu baris pada suatu tabel hanya merujuk ke satu baris di tabel lainnya, contoh sebagai berikut: Tabel A : eksekutif id_eksekutif
nama
1
Akhtar Naufal Shagufta
2
Hana Fahmida Zahra
3
Umar Fawaz
Tabel B : asisten id_asisten
nama_asisten
id_eksekutif
1
Ayu
1
2
Fitria
2
3
Sandra
3
Perhatikan id_eksekutif pada tabel eksekutif tepat berelasi satu ke tabel asisten pada kolom id_eksekutif.
6 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
1.3.3.3 Relasi banyakkebanyak (ManytoMany) Relasi banyakkebanyak terjadi bila beberapa baris pada sebuah tabel berelasi ke beberapa baris pada tabel yang lain. Jika terjadi kasus seperti ini Anda tidak dapat merepresentasikan relasi ini hanya dengan dua tabel Anda memerlukan satu tabel lain yang mewakili relasi banyakkebanyak itu. Sebagai contoh Anda ingin merelasikan tabel surat_berita dan tabel klien, pada kasus ini beberapa klien dapat memilih beberapa surat_berita sehingga satu surat_berita pun dapat merujuk ke beberapa klien maka untuk menggambarkan relasi seperti itu gunakan satu tabel tambahan. Sehingga hasilnya adalah seperti berikut : Tabel A : klien id_klien
nama_klien
1
Akhtar Naufal Shagufta
2
Hana Fahmida Zahra
3
Umar Fawaz
Tabel B : surat_berita id_sb
nama_sb
1
Komputer
2
Politik
3
Populer
Tabel C : klien_surat_berita id_ksb
id_klien
id_sb
1
1
1
2
1
3
3
2
1
4
2
3
5
3
2
6
3
3
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 7
8 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
II. Pengantar MySQL 2.1 Pendahuluan MySQL merupakan Database Management System SQL open source yang paling populer, yang dikembangkan, didistribusikan, dan didukung oleh MySQL AB. MySQL AB adalah sebuah perusahaan komersial, yang didirikan oleh para pengembang MySQL. MySQL AB adalah perusahaan open source generasi kedua yang menyatukan nilainilai dan metodologi open source dengan suatu model bisnis yang sukses. Berikut ini fiturfitur utama MySQL:
MySQL adalah relational database management system
Software MySQL adalah open source
Database server MySQL sangat cepat, reliable, dan mudah digunakan
Database server cMySQL bekerja dalam client/server atau embedded system
2.2 Penyesuaian dengan standarstandar SQL MySQL mendukung entrylevel SQL92. Entrylevel berisi serangkaian keistimewaan keistimewaan yang mendefinisikan dasardasar pemenuhan SQL92. Oracle menyesuaikan dengan SQL89, yang mana adalah suatu subset dari tipe SQL92 dengan tambahan tipetipe spesifik. Beberapa tipe SQL92 dipetakan kedalam tipetipe oracle. PostgreSQL menggunakan suatu subset dari bahasa SQL9299 yang diperluas dan bahasa SQL 3. Sintak tipetipe data SQL92 dipetakan langsung kedalam tipe asli postgreSQL.
2.3 Programprogram klien MySQL Programprogram klien MySQL dapat dipanggil atau dijalankan dari commandline, seperti dari sebuah console prompt Windows, atau dari sebuah UNIX prompt shell. Ketika Anda menjalankan suatu program klien, Anda dapat menentukan opsiopsi untuk mengontrol tindak tanduk dari program klien. Beberapa opsi menjelaskan kepada program klien tentang bagaimana menghubungi server MySQL. Beberapa opsi lainnya menjelaskan kepada program klien aksi yang manakah yang harus dilakukan.
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 9
2.3.1 Program klien mysql Program klien mysql memungkinkan Anda mengirimkan permintaanpermintaan (query) ke server MySQL, dan menerima hasilnya. Untuk menentukan opsiopsi yang didukung oleh program mysql, jalankan perintah dengan opsi –help. Sebagai contoh, untuk mencari tahu bagaimana menggunakan mysql , ketiklah perintah berikut ini: shell> mysql help
Untuk mengetahui versi dari program mysql, gunakan opsi –version: shell> mysql version
Untuk menghubungi server menggunakan program klien, klien harus mengetahui pada komputer yang manakah server MySQL aktif atau berjalan. Sebuah koneksi atau hubungan bisa dilakukan secara lokal pada suatu server MySQL yang berjalan pada komputer yang sama dengan komputer yang sedang menjalankan program klien mysql, atau dapat dilakukan secara jarak jauh (remote) ke suatu server MySQL yang berjalan pada komputer yang berbeda dengan komputer yang sedang menjalankan program klien mysql, Anda tentunya harus memiliki user account (username dan password) yang terdaftar pada server MySQL tersebut untuk dapat melakukan koneksi ke server. Dua buah opsi yang menunjukkan kepada klien dimanakah server MySQL berjalan, begitu juga tipe koneksi yang dilakukan. host=nama_komputer
atau h nama_komputer
10 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
Opsi ini menentukan pada komputer yang manakah server MySQL aktif atau berjalan. Nilai dari opsi ini dapat berupa nama komputer atau nomor IP. Nilai default adalah localhost.
port=nomor_port
atau P nomor_port
Opsi ini menunjukkan nomor port yang manakah yang dapat dihubungi pada komputer server, ini hanya diterapkan untuk koneksi TCP/IP. Default nomor port MySQL adalah 3306. Dua buah opsi yang menyediakan informasi indentifikasi, yaitu username dan password atau user account yang Anda akan gunakan untuk dapat mengakses server. user=username
atau u username
Opsi ini menentukan username untuk account MySQL Anda. password=password
atau ppassword
Opsi ini menentukan password untuk account MySQL Anda. Berikut ini contohcontoh bagaimana menggunakan opsiopsi program klien mysql untuk melakukan koneksi:
Koneksi ke server menggunakan default nama komputer dan default username tanpa password: shell> mysql
Koneksi ke server pada komputer lokal dengan nama user 'naufal', dan meminta mysql untuk menanyakan password Anda: shell> mysql host=localhost password user=naufal
Koneksi ke server dengan opsi yang sama dengan contoh sebelumnya, tetapi menggunakan bentuk opsi singkat: shell> mysql h localhost p u naufal
Koneksi ke server dengan IP address yang spesifik, dengan nama user 'naufal' dan password 'rahasia':
shell> mysql host=192.168.1.33 password=rahasia user=naufal
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 11
Koneksi ke server pada localhost dengan default username dan password dan dengan mengkompress paket data yang lewat atau melintas antara klien dan server:
shell> mysql host=localhost compress
2.3.2 Program klien mysqlimport mysqlimport adalah program klien yang memuat filefile data kedalam tabeltabel. Program ini menyediakan antar muka commandline dengan pernyataan LOAD DATA INFILE. Hal ini berarti mysqlimport memeriksa opsiopsi yang diberikan pada command line dan membuat suatu pernyataan LOAD DATA INFILE yang berhubungan dengan aksi yang disebutkan oleh opsiopsi tersebut. Kemudian melakukan koneksi ke server dan untuk setiap file input, menghasilkan pernyataan LOAD DATA INFILE yang memuat file tersebut dengan benar kedalam tabel yang sesuai. Cara menjalankan perintah mysqlimport pada commandline seperti berikut ini: shell> mysqlimport options nama_database file_input
nama_database adalah nama dari database yang berisi tabel tabel yang akan diisi data, dan file_input adalah nama file yang berisi data yang akan dimuat ke tabel. Setiap tabel yang akan diisi oleh mysqlimport harus sudah ada dalam database, dan setiap file input seharusnya hanya mengandung nilainilai data. mysqlimport tidak dimasudkan untuk memproses filefile input yang mengandung perintahperintah SQL (yaitu seperti yang dibuat dengan program mysqldump).
2.3.3 Program klien mysqldump Program klien mysqldump mengekspor isi dari tabeltabel yang ada dalam suatu database ke suatu file. Program ini sangat berguna untuk membackup database, atau untuk mentransfer isi dari database ke server lain. mysqldump dapat menghasilkan filefile hasil dump berfornat SQL yang mengandung perintahperintah CREATE TABLE dan INSERT untuk membuat ulang filefile dump, atau dapat menghasilkan filefile data dengan delimiter tabulasi.
12 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
2.3.3.1 Operasi mysqldump Secara default mysqldump menginterpretasi argumen pertama yang bukan option sebagai nama database dan akan mengekspor seluruh tabeltabel yang ada dalam database tersebut.
Perintah berikut ini akan mengekspor seluruh isi tabeltabel dalam database sekolah kedalam suatu file dengan nama file 'sekolah.sql': shell> mysqldump sekolah > sekolah.sql
Perintah mysqldump berikut ini disertai dengan 3 argumen yang bukan option, argumen pertama adalah nama database dan argumen ke duan dan ketiga adalah namanama tabel dalam database, hasil dump disimpan kedalam file dengan nama pelajar_guru.sql: shell> mysqldump sekolah pelajar guru > pelajar_guru.sql
2.3.3.2 Memuat ulang hasil mysqldump Untuk memuat ulang sebuah file dump berformat SQL yang dihasilkan oleh mysqldump, gunakan program klien mysql. Guna membuat salinan tabel pelajar dari database sekolah kedalam database kampus, sebagai contoh, Anda dapat menjalankan perintah berikut ini: shell> mysqldump opt sekolah pelajar > perlajar.sql shell> mysql kampus < pelajar.sql
mysql dapat membaca dari sebuah pipe, sehingga Anda dapat mengkombinasikan dengan penggunaan perintah mysqldump dan mysql menjadi sebuah perintah tunggal. Contoh sebelumnya dapat ditulis menjadi berikut ini: shell> mysqldump opt sekolah pelajar | mysql kampus
2.3.4 Program klien mysqlcheck dan myisamchk Program klien mysqlcheck dan myisamchk digunakan untuk memeriksa dan memperbaiki tabeltabel (khususnya tabel tabel MyISAM). Programprogram klien tersebut dapat membantu menjaga tabeltabel Anda terbebas dari masalahmasalah, atau memeperbaiki tabeltabel Anda jika terjadi masalah sebagai contoh tabeltabel MyISAM menderita kerusakan akibat server crash. mysqlcheck dan myisamchk memiliki fungsi yang sama, tetapi mereka memiliki beberapa perbedaan. Berikut ini perbandingan antara kedua program tersebut: Kedua program dapat memeriksa, memperbaiki dan menganalisa tabeltabel MyISAM. Mysqlcheck dapat juga mengoptimasi tabeltabel MyISAM, begitu juga tabeltabel InnoDB Panduan Pendayagunaan Open Source Software: RDBMSMySQL 13
dan menganalisa tabeltabel BDB. Ada operasioperasi tertentu yang hanya dapat dilakukan oleh myisamchk sedangkan mysqlcheck tidak, yaitu mendisable atau mengenable pengindekan(indexes).
2.4 Database secara umum dan manipulasi tabel Setiap server MySQL memiliki suatu direktori data yang mana didalam direktori ini tabel tabel dan database berada dan dikelola. Server merepresentasikan hal berikut ini:
MySQL menghubungkan masingmasing database dengan suatu direktori yang ada didalam direktori data (ini berarti direktori data adalah direktori parent dari semua direktoridirektori database). Sebuah direktori database memiliki nama yang sama dengan nama database itu sendiri. Sebagai contoh, suatu database diberi nama 'sekolah' maka direktori databasenya juga memiliki nama 'sekolah' yang berada dalam direktori data. MySQL menggunakan direktori database untuk mengatur komponenkomponen database yakni tabeltabel dan indekindek. Sebuah database bisa jadi kosong atau hanya berisi satu atau beberapa tabel. Database tidak beranak atau tidak dapat memiliki subsub database, dengan kata lain suatu database tidak lagi mengandung atau berisi database lainnya didalamnya. Setiap tabel dalam suatu database terdiri dari barisbaris dan kolomkolom. Suatu tabel bisa jadi kosong (tidak memiliki barisbaris data atau record), tetapi minimal harus memiliki sebuah kolom. Suatu tabel bisa juga diindek agar meningkatkan performa query. Setiap tabel dihubungkan dengan sebuah file formaAUTO_INCREMENT, diterapkan pada kolomkolom integer. Digunakan untuk menghasilkan integer dengan urutan nilai yang unik. Kolom demikian dalam suatu tabel hanya ada satu.
BINARY, diterapkan pada CHAR dan VARCHAR
NULL dan NOT NULL, dapat diterapkan pada semua kolom
DEFAULT, menyediakan suatu nilai baku dalam kasus tidak ada nilai yang diberikan. PRIMARY KEY dan UNIQUEt dalam direktori database yang berisi definisi definisi dan strukturstruktur tabel tersebut. Nama dari file format sama dengan nama tabel ditambah akhiran .frm. Sebagai contoh, file format untuk tabel pelajar dalam database sekolah diberi nama pelajar.frm dan diletakkan dalam direktori sekolah yang berada dibawah direktori data server MySQL. Bergantung pada tipe tabel, storage engine untuk suatu tabel biasanya akan membuat filefile tambahan untuk tabel tersebut. Jika tabel pelajar memiliki tipe MyISAM, maka storage engine MyISAM akan membuat filefile data dan indek yang diberi nama pelajar.MYD dan pelajar.MYI yang masingmasing digunakan untuk menyimpan
14 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
barisbaris data dan indekindek. Jika tabel pelajar memiliki tipe InnoDB, MySQL masih membuat suatu file format pelajar.frm dalam direktori database, tetapi storage engine InnoDB menyimpan tabel data dan informasi indeks kedalam InnoDB tablespace.
2.5 Storage Engine dan Tipetipe tabel MySQL mendukung beberapa storage engine yang bertindak sebagai pengatur untuk berbagai tipe tabel yang berbeda. Storage engine MySQL mencakup keduanya yang mengatur tabeltabel yang transaksinya aman (transactionsafe), dan yang mengatur tabeltabel yang transaksinya tidak aman (nontransactionsafe):
Storage engine asli adalah ISAM, yang menangani tabeltabel nontransaksi (non transactional). Storage engine ISAM telah digantikan dengan MyISAM dan sudah lama tidak digunakan lagi. Pada MySQL 4.1 storage engine ini sudah kuno, bahkan pada MySQL 5.0 dihilangkan. Storage engine MyISAM diperkenalkan pada MySQL 3.23.0. MyISAM merupakan peningkatan untuk menggantikan ISAM. MyISAM menangani tabeltabel non transaksi (nontransactional). MyISAM memberikan kecepatan dalam proses penyimpanan dan pengambilan, begitu juga kemampuankemampuan pencarian keseluruhan teks (fulltext). MyISAM didukung dalam seluruh konfigurasi MySQL, dan secara default MyISAM menjadi storage engine yang digunakan dalam MySQL, kecuali jika Anda mengkonfigurasi MySQL menggunakan storage engien yang lainnya. Storage engine MEMORY menyediakan tabeltabel inmemory. Storage engine MERGE ditambahkan kedalam MySQL 3.23.25. Storage engine ini memungkinkan sekumpulan tabeltabel MyISAM yang identik untuk dikelola sebagai suatu tabel tunggal. Seperti MyISAM, Storage engine MEMORY dan MERGE menangani tabeltabel nontransasksi ( nontransactional), dan keduanya juga disertakan secara default dalam MySQL. Catatan: Storage engine MEMORY pertama kali dikenal sebagai HEAP engine.
Storage engine InnoDB dan BDB yang menangani tabeltabel transasctionsafe diperkenalkan dalam versi MySQL 3.23 selanjutnya.BDB disertakan dalam distribusi binari MySQLMax pada sistem operasi – sistem operasi yang mendukungnya. InnoDB juga disertakan dalam distribusi binari MySQLMax untuk MySQL 3.23. Mulai dengan MySQL 4.0, InnoDB telah disertakan secara default dalam seluruh distribusi binari MySQL. Dalam distribusidistribusi source, Anda dapat mengenable atau mendisable storage engine storage engine tersebut Panduan Pendayagunaan Open Source Software: RDBMSMySQL 15
dengan mengkonfigurasi MySQL sesuai dengan kebutuhan Anda.
NDB cluster adalah storage engine yang digunakan oleh MySQL cluster untuk implementasi tabeltabel yang terpisah di beberapa komputer. Engine ini tersedia dalam distribusi source MySQL 4.1.2 dan distribusi binari MySQLMax 4.1.3. Storage engine ini saat ini didukung hana di Linux, Solaris, dan Mac OS X . MySQL berniat untuk mendukung engine ini pada platform sistem operasi lainnya seperti MS Windows, dan dalam rilis MySQL mendatang. Storage engine EXAMPLE adalah suatu sub engine yang tidak menangani apapun. Anda dapat membuat tabeltabel dengan engine ini, tetapi tidak ada data yang dapat disimpan atau diambil dalam tabel tersebut. Engine EXAMPLE ini disediakan sebagai contoh dalam kode sumber MySQL yang menggambarkan bagaimana memulai membuat storage engine baru. Ini umumnya untuk yang tertarik atau untuk para pengembang. Storage engine ARCHIVE digunakan untuk penyimpanan sejumlah besar data tanpa pengindekan dengan sebuah footprint yang sangat kecil. Storage engine CSV menyimpan data dalam file teks dengan menggunakan tanda koma sebagai format pemisah antar nilainilai dalam file teks tersebut. Storage engine BLACKHOLE menerima tetapi tidak menyimpan data, selalu mengembalikan atau menampilkan sesuatu yang kosong. Storage engine FEDERATED menyimpan data dalam remote database. Dalam MySQL 5.1, storage engine ini hanya bekerja dengan MySQL, dengan menggunakan MySQL C client API. Dalam rilis masa depan, dimaksudkan untuk memungkinkannya untuk terkoneksi dengan sumber data lainnya dengan menggunakan driverdriver atau metodemetode koneksi klien yang lainnya.
2.6 Tipetipe kolom Untuk setiap tipe data, sintak yang ditampilkan menggunakan tanda kurung siku (square brackets) ([ ]) adalah untuk menunjukkan bagian dari sintak yang bersifat opsional. Contoh berikut ini menunjukkan bagaimana BIGINT dijelaskan dalam bab ini: BIGINT[(display_size)]
Sebagai tambahan terhadap tipe BIGINT, banyak jenis tipe data MySQL lainnya yang mendukung spesifikasi dari ukuran.. Kecuali jika tidak dispesifikasikan, nilai tersebut harus berupa sebuah bilangan integer atau bilangan bulat antara 1 dan 255.
16 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
2.6.1 NUMERIK MySQL mendukung semua tipe data standar numerik(bilangan) SQL .Jenis ini meliputi tipe data bilangan bulat (INTEGER, SMALLINT, DESIMAL, dan NUMERIC), seperti halnya tipe data bilangan desimal (FLOAT, REAL, dan DOUBLE PRECISION). Keyword INT adalah suatu sinonim untuk BILANGAN BULAT (INTEGER), dan keyword DEC adalah satu sinonim untuk bilangan DESIMAL. Terhitung sejak MySQL 5.0.3, tipe data BIT tersedia untuk menyimpan nilainilai kolom bit. (Sebelum 5.0.3, MySQL menginterpretasikan BIT seperti TINYINT (1 ).) Di MySQL 5.0.3, BIT didukung hanya untuk MyISAM. MySQL 5.0.5 memperluas dukungan BIT pada MEMORY, InnoDB, dan BDB. Sebagai satu ekstensi ke SQL standar, MySQL juga mendukung jenis bilangan bulat TINYINT, MEDIUMINT, dan BIGINT. Untuk tipetipe bilangan bulat selalu disediakan atribut auto_increment, signed dan unsigned. Signed berarti nilai negatif ikut dalam deklarasi tersebut sedang unsigned hanya nilai positif. Jika unsigned tidak dideklarasikan maka nilai default adalah signed. INT/INTEGER Deklarasi : INT [(display_size)] [auto_increment] [unsigned] [zerofill] Penyimpanan: 4 byte Nilai yang dapat disimpan adalah integer 0 sampai dengan 4294967295 jika unsigned. – 2147483648 sampai dengan 214797647 jika signed. TINYINT Deklarasi : TINYINT [(display_size)] [auto_increment] [unsigned] [zerofill] Penyimpanan: 1 byteAUTO_INCREMENT, diterapkan pada kolomkolom integer. Digunakan untuk menghasilkan integer dengan urutan nilai yang unik. Kolom demikian dalam suatu tabel hanya ada satu. ●
BINARY, diterapkan pada CHAR dan VARCHAR
●
NULL dan NOT NULL, dapat diterapkan pada semua kolom
●
DEFAULT, menyediakan suatu nilai baku dalam kasus tidak ada nilai yang diberikan.
PRIMARY KEY dan UNIQUE Nilai yang dapat disimpan adalah integer 0 sampai dengan 255 jika unsigned. 128 sampai dengan 127 jika signed. Panduan Pendayagunaan Open Source Software: RDBMSMySQL 17
MEDIUMINT Deklarasi : MEDIUMINT [(display_size)] [auto_increment] [unsigned] [zerofill] Penyimpanan: 3 byte Nilai yang dapat disimpan adalah integer 0 sampai dengan 16777215 jika unsigned. 83888608 sampai dengan 82888607 jika signed. BIGINT Deklarasi : BIGINT [(display_size)] [auto_increment] [unsigned] [zerofill] Penyimpanan: 8 byte Nilai yang dapat disimpan adalah integer 0 sampai dengan 18446744073709551615 jika unsigned. –9223372036854775807 sampai dengan 922337203685477580787 jika signed. SMALLINT Deklarasi : SMALLINT [(display_size)] [auto_increment] [unsigned] [zerofill] Penyimpanan: 2 byte Nilai yang dapat disimpan dengan jangkauan mulai dari 0 sampai dengan 65535 jika unsigned dan 32768 sampai 32767 jika signed. FLOAT Deklarasi : FLOAT [(display_size,digits)] [zerofill] Penyimpanan: 4 byte Float menyimpan bilangan real dan tidak dapat bersifat unsigned. Nilai presisi tunggal yang dapat disimpan adalah –3,402823466E+38 sampai dengan –1,1175494351E38,0, dan 1,1175494351E38 sampai dengan 3,402823466E+38. DOUBLE Deklarasi : DOUBLE [(M,D)] [zerofill] Penyimpanan: 8 byte Double menyimpan bilangan real dengan presisi ganda. Nilai yang boleh adalah – 1,7976931348623167E+308 sampai dengan –2.2250738585072014E308,0, dan 2.2250738585072014E308 sampai dengan 1,7976931348623167E+308. Nilai M merupakan maksimal panjang tampilan. Nilai D merupakan nilai desimal. 18 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
DECIMAL Deklarasi : DECIMAL [(precision [,scale])] [zerofill] Penyimpanan: precision + 2 byte Menyimpan bilangan floating point dimana ketepatan adalah kritis, seperti untuk nilai mata uang. Tipe DECIMAL memerlukan Anda untuk menspesifikasikan precision dan scale. Precision adalah jumlah nilai digit yang berarti. Scale adalah jumlah digit yang mengikuti tanda desimal. Sebagai contoh, sebuah kolom BALANCE dideklarasikan sebagai DECIMAL(9,2) yang akan menyimpan sejumlah 9 digit berarti, dengan dua digit diantaranya berada disebelah kanan tanda desimal. Range nilai dari contoh deklarasi kolom BALANCE tersebut adalah mulai 9,999,999.99 sampai 9,999,999.99.
2.6.2 String Tipe data string menyimpan bermacammacam jenis data teks. Terdapat sejumlah tipetipe data teks yang diakomodasi dengan beragam ukuran. Untuk masingmasing ukuran, ada suatu tipe yang menyusun dan membandingkan data secara casesensitive, sesuai dengan susunan karakter baku. Suatu tipe binari melakukan penyusunan dan perbandingan sederhana byte demi byte. Dengan kata lain, nilai binari adalah casesensitive. Untuk CHAR dan VARCHAR, tipetipe binari dideklarasikan dengan menggunakan atribut BINARY . Tipetipe TEXT, bagaimanapun juga, memiliki hubungan dengan tipetipe BLOB. BLOB Deklarasi: BLOB Bentuk binari dari TEXT. CHAR Deklarasi: CHAR(size) [BINARY] ukuran: ditetapkan oleh nilai ukuran dengan jangkauan sampai dengan 255 Penyimpanan: size byte Suatu kolom dengan nilai teks yang panjangnya tetap. Nilai string dengan jumlah karakter lebih sedikit dari ukuran kolom maka akan diisi dengan spasi. Spasi yang diisikan tersebut ketika diambil dari database akan dihilangkan.
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 19
LONGBLOB Deklarasi: LONGBLOB Bentuk binari dari LONGTEXT LONGTEXT Deklarasi: LONGTEXT ukuran: 0 samapai 4294967295 Penyimpanan: panjang nilai + 4 byte Menyimpan nilai teks yang besar. Secara teori batas ukuran dari teks yang dapat disimpan dalam sebuah kolom LONGTEXT melampaui 4 GB, pada prakteknya kurang. Ini sehubungan dengan batasan dari protokol komunikasi MySQL, dan jumlah memori yang tersedia pada komunikasi antara klien dan server. MEDIUMBLOB Deklarasi: MEDIUMBLOB bentuk dari MEDIUMTEXT MEDIUMTEXT Deklarasi: MEDIUMTEXT ukuran: 0 sampai 16777215 Penyimpanan: panjang nilai + 3 byte Menyimpan nilai teks dengan ukuran menengah. TEXT Deklarasi: TEXT ukuran: 0 sampai 65535 Penyimpanan: panjang nilai + 2 byte Penyimpanan untuk sebagian besar teks. TINYBLOB Deklarasi: TINYBLOB 20 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
bentuk binari dari TINYTEXT TINYTEXT Deklarasi: TINYTEXT ukuran: 0 sampai 255 Penyimpanan: panjang nilai + 1 byte Menyimpan nilai teks yang pendek VARCHAR Deklarasi: VARCHAR(size) [BINARY] ukuran: ditetapkan oleh nilai ukuran dalam suatu jangkauan sampai 255. Penyimpanan: panjang nilai + 1 byte Menyimpan nilai teks yang panjangnya bervariasi.
2.6.3 Date Tipetipe data date MySQL adalah perangkat yang fleksibel untuk menyimpan informasi tanggal dan waktu. Untuk memvalidasi nilai tanggal dan waktu, itu diserahkan pada aplikasi bukan database. MySQL hanya akan memeriksa bulan yang memiliki jangkauan 0 sampai 12, dan tanggal dari 0 smapai 31. February 31, 2006 adalah suatu contoh informasi tanggal MySQL yang sah. February 0, 2006 adalah informasi tanggal yang juga sah bagi MySQL. Dengan kata lain, Anda dapat menggunakan 0 untuk menandakan tanggal yang Anda tidak ketahui pasti. MySQL secara otomatis akan mengkonversi nilainilai tanggal dan waktu menjadi bilangan integer ketika digunakan dalam suatu konteks bilangan integer. DATE Deklarasi: DATE Format: YYYYMMDD (20060101) Penyimpanan: 3 byte Menyimpan tanggal dalam jangkauan dari 1 januari 1000 ('10000101') sampai dengan 31 Desember 9999 ('99991231') dalam almanak Gregorian.
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 21
DATETIME Deklarasi: DATETIME Format: YYYYMMDD hh:mm:ss (20060101 01:00:00) Penyimpanan: 8 byte Menyimpan informasi waktu yang spesifik dalam jangkauan dari 1 Januari 1000 12:00:00 AM ('10000101 00:00:00') sampai 31 Desember 9999 11:59:59 PM ('99991231 23:59:59') dalam almanak Gregorian. TIME Deklarasi: TIME Format: hh:mm:ss (06:00:00) Penyimpanan: 3 byte Menyimpan nilai waktu dalam jangkauan mulai dari tengah malam ('00:00:00') sampai 1 detik sebelum waktu tengah malam ('23:59:59').
TIMESTAMP Deklarasi: TIMESTAMP[(display_size)] Format: YYYYMMDDhhmmss(20010101060000) Penyimpanan: 4 byte Sebuah representasi dari sebuah penunjukan waktu ke detik dalam jangkauan dari tengah malam pada 1 januari 1970, sampai pada satu menit sebelum tengah malam pada 31 Desember 2037. Kegunaan utama adalah menjaga jejak dari perubahanperubahan tabel. Ketika Anda memasukkan suatu nilai NULL kedalam suatu kolom TIMESTAMP, maka tanggal dan waktu saat ini yang akan di masukkan. Jika Anda merubah beberapa nilai dari sebuah baris dengan suatu kolom TIMESTAMP, maka kolom TIMESTAMP yang pertama akan diupdate secara otomatis dengan tanggal dan waktu saat ini.
YEAR Deklarasi: YEAR[(size)] Format: YYYY(2006) Penyimpanan: 1 byte Menyimpan suatu informasi tahun dari alamanak Gregorian. Parameter size 22 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
memungkinkan Anda untuk menyimpan tahun dengan menggunakan 2 digit dari 4 digit tahun. Jangkauan untuk suatu YEAR(4) adalah mulai 1900 sampai 2155, sedangkan YEAR(2) dari 1970 sampai 2069. Nilai size baku adalah YEAR(4).
2.6.4 Tipe data Komplek Tipe data komplek MySQL yaitu ENUM dan SET adalah tipe string yang khusus. Mereka didaftarkan secara terpisah karena mereka secara konsep lebih komplek, dan merepresentasikan suatu bawaan tipe data SQL 3 yang didukung MySQL di masa datang. ENUM Deklarasi: ENUM(nilai1, nilai2, .....) Penyimpanan: 1255 anggota nilai: 1 byte / 25665535 anggota nilai: 2 byte Menyimpan satu nilai dari suatu daftar nilainilai teks yang mungkin yang sebelumnya sudah didefinisikan. Ketika Anda membuat sebuah kolom ENUM, Anda menyediakan suatu daftar dari seluruh nilainilai yang mungkin. Nilainilai yang dapat ditambahkan dan dirubah pada suatu kolom ENUM hanya yang terdfatar dalam daftar nilainilai teks yang mungkin tersebut. Jika Anda mencoba memasukkan suatu nilai yang tidak terdapat dalam daftar atau bukan bagian dari daftar maka akan menyebabkan sebuah string kosong yang akan disimpan. SET Deklarasi: SET(nilai1, nilai2, ....) Penyimpanan: 1 sampai 8 anggota nilai: 1 byte 9 sampai 16 anggota nilai: 2 byte 17 sampai 24 anggota nilai: 3 byte 25 sampai 32 anggota nilai: 4 byte 33 sampai 64 anggota nilai: 8 byte Sebuah daftar nilainilai yang diambil dari sekumpulan nilainilai yang sudah didefinisikan sebelumnya. Sebuah kolom dapat menyimpan beberapa atau tidak sama sekali nilainilai teks yang telah didefinisikan dalam pernyataan SET. SET pada dasarnya adalah sebuah ENUM yang memungkinkan setiap kolom untuk menyimpan lebih dari satu nilai.SET tidak menyimpan sesuai dengan indek, tetapi seperti suatu bitmap yang komplek. Suatu SET dengan anggotaanggota nilai Jeruk, Apel, Pir, dan Pisang, masingmasing elemen Panduan Pendayagunaan Open Source Software: RDBMSMySQL 23
dinyatakan oleh suatu bit 'on' dalam sebuah byte, sebagaimana ditunjukkan dibawah ini:
Representasi Elemenelemen SET MySQL Member
Nilai Desimal
Representasi secara Bit
Jeruk
1
0001
Apel
2
0010
Pir
4
0100
Pisang
8
1000
Dalam contoh ini, nilainilai Jeruk dan Pir disimpan dalam database sebagai 5 (0101). Anda dapat menyimpan suatu nilai maksimum 64 dalam suatu kolom SET. Meskipun Anda dapat memberi nilai yang sama beberapa kali dalam suatu pernyatan SQL pengubahan suatu kolom SET, hanya sebuah nilai yang sebenarnya disimpan.
2.7 Opsiopsi Kolom Dalam MySQL, pada waktu pertama membuat tabel, atau dikemudian waktu, Anda dapat menambah, merubah opsiopsi kolom tabel. Opsiopsi kolom membatasi data agar dimasukkan sesuai dengan opsi yang telah ditetapkan. ●
UNSIGNED, membuat kolom tidak boleh memiliki nilai negatif
●
ZEROFILL, mengisi lebar data yang ditampilkan dengan nol
●
AUTO_INCREMENT, diterapkan pada kolomkolom integer. Digunakan untuk menghasilkan integer dengan urutan nilai yang unik. Kolom demikian dalam suatu tabel hanya ada satu.
●
BINARY, diterapkan pada CHAR dan VARCHAR
●
NULL dan NOT NULL, dapat diterapkan pada semua kolom
●
DEFAULT, menyediakan suatu nilai baku dalam kasus tidak ada nilai yang diberikan.
●
PRIMARY KEY dan UNIQUE
2.8 Operator MySQL menawarkan tiga jenis operator: arithmatic, compparison, dan logical.
24 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
2.8.1 Peraturan ketentuan hak yang lebih tinggi Ketika SQL mengandung pernyataan yang komplek, sub pernyataan dievaluasi berdasarkan ketentuan aturan MySQL yang lebih tinggi. Anda dapat megesampingkan ketentuan aturan MySQL yang lebih tinggi dengan mengurung suatu pernyataan dalam tanda kurung: Prioritas hak yang lebih tinggi
Operatoroperator
1
BINARY
2
NOT
3
^
4
(unary minus)
5
* / %
6
+
7
<< >>
8
&
9
|
10
<= >= = <=> <> IN IS LIKE REGEXP
11
BETWEEN CASE
12
AND
13
OR XOR
2.8.2 Operator Arithmatic Operatoroperator arithmatic melakukan arithmatic dasar antara dua buah nilai: Operator
Deskripsi
+
Menambahkan dua buah nilai bilangan
Mengurangi dua buah nilai bilangan
*
Mengalikan dua buah nilai bilangan
/
Membagi dua buah nilai bilangan
%
Memberikan sisa hasil bagi dua buah nilai bilangan
|
Melakukan operasi OR secara bit antara dua buah nilai bilangan bulat
^
Melakukan operasi eksklusif OR secara bit antara dua buah nilai bilangan bulat
&
Melakukan operasi AND secara bit antara dua buah nilai bilangan bulat Panduan Pendayagunaan Open Source Software: RDBMSMySQL 25
<<
Melakukan operasi geser kekiri secara bit pada sebuah nilai bilangan bulat
>>
Melakukan operasi geser kekanan secara bit pada sebuah nilai bilangan bulat
2.8.3 Operator Comparison Operator comparison membandingkan nilainilai dan mengembalikan 1 jika perbandingan adalah benar (true), dan 0 (false) jika sebaliknya. Kecuali untuk operator <=>, nilai NULL mengakibatkan suatu operator comparison mengevaluasinya ke NULL. Operatoroperator
Deskripsi
<> atau !=
Mencocokkan baris jika kedua nilai tidak sama atau tidak sebanding
<=
Mencocokkan baris jika nilai sebelah kiri lebih kecil atau sama dengan nilai sebelah kanan
<
Mencocokkan baris jika nilai sebelah kiri lebih kecil dari nilai sebelah kanan
>=
Mencocokkan baris jika nilai sebelah kiri lebih besar atau sama dengan nilai sebelah kanan
>
Mencocokkan baris jika nilai sebelah kiri lebih besar dari nilai sebelah kanan
nilai BETWEEN nilai1 AND nilai2
Mencocokkan baris jika nilai adalah antara nailai1 dan nilai2, atau sama dengan nilai1 atau nilai2
nilai IN (nilai1, nilai2,....)
Mencocokkan baris jika nilai termasuk dalam daftar nilai
nilai NOT IN (nilai1, nilai2,....)
Mencocokkan baris jika nilai tidak termasuk dalam daftar nilai
nilai1 LIKE nilai2
Membandingkan nilai1 dan nilai2 dan mencocokkan baris jika mereka sesuai. Nilai disebelah kanan dapat berupa karakter wildcard '%', yang cocok dengan semua karakter (termasuk nol karakter), dan '_', yang mencocokkan tepat ke satu karakter. Penggunaan yang sering adalah membandingkan suatu nilai kolom dengan satu string yang mengandung wildcard (contoh: SELECT name FROM pegawai WHERE name LIKE 'B%').
nilai1 NOT LIKE nilai2
Membandingkan nilai1 dan nilai2 dan mencocokkan baris jika mereka berbeda. Ini identik dengan NOT (nilai1 LIKE nilai2)
nilai1 REGEXP/RLIKE
Membandingkan nilai1 dan nilai2 dengan menggunakan
26 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
nilai2
extended reguler expression dan mencocokkan baris jika kedua nilai sesuai. Nilai sebelah kanan dapat mengandung penuh konsep wildcard reguler expression UNIX (contoh: SELECT name FROM pegawai WHERE name RLIKE '^B.*'
nilai1 NOT REGEXP nilai2 Membandingkan nilai1 dan nilai2 dengan menggunakan extended reguler expression dan mencocokkan baris jika kedua nilai berbeda. Ini identik dengan NOT (nilai1 REGEXP nilai2).
2.8.4 Operator Logical Operator logical memeriksa nilai kebenaran dari satu atau lebih pernyataan. Dalam istilah SQL, suatu operator logical memeriksa apakah operandoperand nya adalah 0, nonzero, atau NULL. Suatu nilai 0 berarti salah (false), nonzero berarti benar(true) dan NULL berarti tak bernilai. Operatoroperator
Deskripsi
NOT atau !
Melakukan suatu logika not(mengembalikan '1' jika nilai adalah 0, NULL jika nilai adalah NULL, jika tidak mengembalikan '0')
OR atau ||
Melakukan suatu operasi logika or (mengembalikan '1' jika salah satu argumen atau nilai bukan nonzero atau bukan NULL, NULL jika salah satu argumen atau nilainya NULL, jika tidak mengembalikan '0')
XOR
Melakukan suatu operasi logika eksklusif or (mengembalikan '1' jika satu dan hanya satu argumen yang bukan 0 dan bukan NULL, NULL jika salah satu adalah NULL, jika tidak mengembalikan '0')
AND atau &&
Melakukan operasi logika and (mengembalikan '0' jika salah satu dari argumen adalah 0, NULL jika salah satu argumen adalah NULL, jika tidak mengembalikan '1')
2.9 Memulai dan mengakhiri koneksi ke database server Untuk koneksi ke database server, Anda biasanya perlu memberikan nama user MySQL dan password nya ketika menjalankan program klien mysql. Jika server berjalan pada komputer yang berbeda , Anda juga perlu memberikan nama komouter atau nomor IP komputer server database tersebut. Pembahasan lebih detil tentang program klien mysql telah dibahas dalam pembahasan sebelumnya. Begitu Anda mengetahui parameterparameter yang diperlukan, maka Anda dapat Panduan Pendayagunaan Open Source Software: RDBMSMySQL 27
melakukan koneksi ke database server MySQL, seperti berikut ini:
Tanda prompt mysql> menjelaskan pada Anda bahwa mysql telah siap menerima perintah (command) dari Anda. Beberapa instalasi MySQL memungkinkan Anda untuk koneksi ke database server sebagai anonymous user (user tak bernama) pada komputer lokal (localhost). Untuk mengakhiri koneksi dari database server , Anda dapat mengetikkan perimtah quit, exit , atau (\q), seperti berikut ini: mysql> q uit
atau mysql> exit
atau mysql> \q
Berikut ini tabel yang menampilkan kondisi setiap prompt yang akan Anda lihat, dan kesimpulan mengenai apa yang terjadi dengan kondisi prompt seperti itu di dalam mysql: Prompt mysql>
kesimpulan Siap menerima perintah baru
>
Menunggu baris perintah berikutnya dari suatu perintah terdiri dari banyak baris
'>
Menunggu baris perintah berikutnya, dengan mengelompokkan sebuah string yang diawali dengan tanda kutip tunggal (')
“>
Menunggu baris perintah berikutnya, dengan mengelompokkan sebuah string yang diawali dengan tanda kutip ganda(“)
`>
Menunggu baris perintah berikutnya, dengan mengelompokkan sebuah identifier diawali dengan tanda backtick (`)
28 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
2.10 Membuat dan menggunakan database Sebelum Anda dapat membuat sebuah tabel Anda harus terlebih dahulu membuat Database. Perintah SQL dapat Anda ketikkan dengan huruf besar maupun kecil. Hanya saja di sini kita menggunakan huruf besar agar Anda lebih mudah membedakan antara perintah SQL dengan objekobjek lainnya. Perlu diingat, setelah selesai mengetikkan perintah SQL pada prompt MySQL, Anda wajib mengetikkan tanda titik koma yang menandakan akhir dari perintah SQL. Sintak penulisan perintah untuk membuat database seperti berikut ini : mysql> CREATE DATABASE database_name; Hal yang harus diperhatikan dalam penamaan database adalah nama tidak boleh menggunakan katakata yang menjadi kosakata SQL seperti select karena hal itu akan membuat rancu. Perlu juga diperhatikan huruf besar atau huruf kecil sebuah nama database karena pada sistem UNIX huruf besar dan huruf kecil dibedakan. Pada contoh dibawah ini akan dibuat database dengan nama 'Perpustakaan' dan 'perpustakaan'.
Sesudah Anda membuat suatu database, selanjutnya jika Anda ingin 'perpustakaan' menjadi database yang Anda akses saat ini maka Anda dapat mengakses database tersebut dengan perintah sebagai berikut : mysql>USE per pustakaan;
Atau Anda dapat juga mengakses database perpustakaan melalui commandline sebagai
berikut:
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 29
2.11 Manipulasi tabel Tabeltabel dapat dibuat dan dimodifikasi jika diperlukan. Jika Anda sudah memilih atau mengakses database maka Anda dapat membuat tabel sebagai berikut.
2.11.1 Membuat tabel Setelah Anda memilih Database barulah Anda dapat membuat sebuah tabel, Sintak penulisan perintah membuat tabel sebagai berikut: mysql> CREATE TABLE nama_tabel( kolom1 tipe_data opsi_kolom,
kolom2 tipe_data opsi_kolom, ..........................., kolomN tipe_data opsi_kolom, PRIMARY KEY(nama_kolom), INDEX (nama_kolom) ) type=tipe_tabel
Dalam pemakaian pernyataan create table Anda akan menemukan 2 opsi yang biasanya menyertai deklarasi definisi kolom yaitu
null/ not null
default
Null/not null mengindikasikan apakah suatu kolom dapat menerima nilai null (nilai tiada). Jika dinyatakan null berarti null dapat terjadi dikolom tersebut sebaliknya bila diberi atribut not null maka nilai null tidak boleh pada kolom tersebut. Default menyatakan nilai baku yang akan dipakai jika dalam suatu proses pemasukan nilai ke kolom tersebut tidak diberi nilai. Contoh berikut akan membuat tabel dengan nama buku:
Setelah Anda membuat tabel, perintah SHOW TABLES seharusnya menampilkan output sebagai berikut: 30 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
Untuk memeriksa tabel yang telah Anda buat sesuai dengan spesifikasi yang telah ditetapkan, gunakanlah perintah DESCRIBE atau DESC. Sebagai contoh jika Anda lupa nama kolom atau tipe kolom dari tabel yang telah Anda buat. Gunakanlah perintah seperti contoh dalam gambar berikut :
2.11.2 Menghapus tabel Untuk menghapus tabel gunakan perintah berikut ini: mysql> DROP TABLE buku;
atau mysql> DROP TABLE IF EXISTS buku;
2.11.3 Merubah tabel ALTER TABLE memungkinkan Anda untuk merubah struktur tabel yang ada. Anda dapat merubah tabel untuk keperluan: Panduan Pendayagunaan Open Source Software: RDBMSMySQL 31
Menambah atau menghapus kolom
Merubah nama atau definisi kolom
Menambah atau menghapus index
Menerapkan suatu susunan berbeda pada barisbaris
Merubah nama tabel
ALTER TABLE bekerja dengan cara membuat salinan tabel dari tabel yang asli yang bersifat sementara (temporer). Proses perubahan tabel dilakukan pada tabel salinan, kemudian tabel asli dihapus, dan yang baru dirubah namanya. Ketika perintah ALTER TABLE sedang dieksekusi, tabel asli masih dapat dibaca oleh klienklien. Proses perubahan dan penulisan terhadap tabel dihentikan sampai tabel yang baru siap, dan kemudian secara otomatis diarahkan ke tabel baru tanpa kegagalan dalam proses perubahan. Contoh berikut adalah perubahan tabel dengan menambah kolom.
Gunakan keyword MODIFY atau CHANGE, jika Anda akan melakukan perubahan tipe data kolom. MODIFY dan CHANGE memiliki fungsi yang sama yaitu merubah tipe data kolom, hanya saja dengan CHANGE memungkinkan nama kolom juga dapat dirubah.
2.11.4 Merubah nama tabel RENAME merubah nama tabel, dan juga bekerja dalam perintah ALTER TABLE:
Merubah beberapa nama tabel sekaligus dapat dilakukan dengan satu perintah saja dimana tabeltabel dipisahakan dengan tanda koma, seperti berikut:
32 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
Merubah tipe dan opsi kolom tabel dapat dilakukan juga bersamaan dengan merubah nama tabel dalam satu perintah seperti berikut ini:
2.12 Index Ketika data dalam tabel bertambah besar jumlahnya, proses pembacaan data akan menjadi lambat. Index memungkinkan nilainilai kolom dapat ditemukan dengan lebih cepat, pengambilan atau pembacaan data berdasarkan index relatif lebih cepat. Agar performa query Anda terjaga secara, sangatlah penting mengindekskan (indexes) tabeltabel Anda. Index dapat melakukan pengunikkan (unique) untuk mencegah duplikasi. MySQL mendukung empat tipe index:
Nonunique simple indexes
UNIQUE index, setiap nilai adalah berbeda dari yang lainnya.
PRIMARY KEY adalah suatu UNIQUE key yang tidak membolehkan nilai NULL.
FULLTEXT dioptimasi untuk pencarian teks.
Index dapat didefinisikan ketika tabel dibuat. Ini meliputi definisi index dalam perintah CREATE TABLE, bersama dengan pendefinisian kolom. Suatu definisi index terdiri dari suatu kata kunci yang menunjukkan tipe index, diikuti oleh suatu daftar namanama kolom yang akan dijadikan index didalam tanda kurung. Dengan mengasumsikan bahwa definisi tabel buku tanpa index tampak seperti berikut :
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 33
2.12.1 Nonunique index Untuk membuat tabel dengan dengan kolomkolom yang sama seperti tabel buku sebelumnya, tetapi dengan suatu Nonunique index pada kolom 'tahun' , klausa INDEX disertakan dalam perintah CREATE TABLE berikut ini:
2.12.2 Unique index Unique melakukan pengunikkan kolom dan mencegah duplikasi. Ini bermanfaat khususnya ketika menetapkan nilainilai untuk proses lookup, seperti id.
2.12.3 Primary Key index Dalam sebuah tabel hanya ada satu buah primary key. Primary key ada;ah suatu UNIQUE index yang tidak mengijinkan nilai NULL.
Index dapat ditambahkan pada suatu tabel. Sebagai tambahan, proses penambahan index dapat dilakukan dengan menggunakan perintah ALTER TABLE, seperti berikut: mysql> ALTER TABLE buku ADD PRIMARY KEY (id)
34 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
2.12.4 Menghapus index Suatu index dapat dihapus dengan dengan perintah DROP INDEX atau ALTER TABLE, seperti berikut: mysql> DROP INDEX tahun ON buku mysql> ALTER TABLE buku DROP INDEX tahun mysql> ALTER TABLE buku DROP PRIMARY KEY
Primary key index hanya dapat dihapus jika kolom yang merupakan index tersebut tidak memiliki atribut atau opsi auto_increment.
2.13 MySQL query MySQL mendukung penuh ANSI SQL92. Referensi SQL untuk MySQL adalah referensi SQL yang umum yang digunakan secara luas. SQL adalah bahasa query database yang serupa dengan bahasa inggris yang terdiri dari susunan kata kerja. Setiap susunan kata kerja ini, diawali dengan sebuah perintah SQL yang diikuti oleh keyword, literals, dan indentifiers, atau puctuation. Dalama bagian ini menggambarkan prinsipprinsip dasar penulisan perintahperintah SQL, bekerja dengan berbagai query, dari dasar hingga yang kompleks. Query menggambarkan beberapa hal tentang klien mysql:
Ketika Anda menuliskan dan mengeksekusi perintah, program klien mysql mengirimkannya ke server untuk dieksekusi dan menampilkan hasilnya, kemudian mencetak prompt mysql> kembali untuk menunjukkan bahwa klien mysql sudah siap menerima perintah lainnya. Klien mysql menampilkan output dari query dalam bentuk tabular (terdiri dari baris dan kolom). Baris pertama menunjukkan namanama kolom tabel. Dan barisbaris berikutnya dalah hasil query. Klien mysql menampilkan juga informasi mengenai berapa banyak baris yang dikembalikan dan berapa lama query tersebut dieksekusi, yang memberikan Anda ide pemikiran tentang performa server.
2.13.1 Perintah SELECT Tidak ada gunanya menyimpan data kedalam database kecuali Anda bermaksud untuk menampilkan dan melakukan sesuatu terhadap data tersebut. Inilah fungsi dari perintah SELECT. Sintaks dasar dari perintah SELECT tampak seperti berikut ini:
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 35
SELECT daftar_pilihan_kolom FROM daftar_tabel WHERE batasan_batasan_utama GROUP BY grup_kolom ORDER BY urutan_kolom HAVING batasan_batasan_tambahan LIMIT jumlah
daftar_pilihan_kolom, menunjukkan kolomkolom apa saja yang akan dipilih atau ditampilkan daftar_tabel, menunjukkan dari tabel apa saja barisbaris data diambil atau dipilih batasan_batasan_utama, menunjukkan apa saja kondisikondisi baris data yang harus terpenuhi
grup_kolom, menunjukkan bagaimana mengelompokkan hasilhasil query
urutan_kolom, menunjukkan bagaimana mengurutkan hasilhasil query
batasan_batasan_tambahan, menunjukkan apa saja kondisikondisi tambahan dari baris data yang harus terpenuhi jumlah, menunjukkan batas dari hasil query.
2.13.1.1 Pengambilan data sederhana Perintah SELECT sederhana untuk mengambil data dari suatu tabel dapat Anda lihat dalam contoh berikut ini:
Untuk pengambilan data berdasarkan kolom kolom tertentu , tampak seperti berikut:
36 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
2.13.1.2 Membatasi suatu perintah SELECT dengan WHERE Anda dapat mengambil atau memilih hanya barisbaris data tertentu saja dari tabel Anda:
2.13.1.3 Mengurutkan pemilihan data menggunakan ORDER BY Dalam contoh sebelumnya, hasil barisbaris data yang ditampilkan tidak dalam urutan tertentu. Biasanya lebh mudah untuk menguji output dari query jika barisbaris data diurutkan. Untuk mengurutkan baris data, gunakan klausa ORDER BY, seperti berikut ini:
Pengurutan baku adalah ascending, dengan susunan urutan dimulai dari nilainilai yang paling kecil. Untuk mengurutkan dalam susunan yang berlawanan (descending), gunakan kata kunci DESC pada nama kolom yang akan Anda urutkan, seperti berikut ini:
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 37
2.13.1.4 Membatasi pengambilan data menggunakan klausa LIMIT Klausa LIMIT memungkinkan Anda untuk membatasi output dari query. Klausa LIMIT sangat berguna, khususnya bersama dengan klausa ORDER BY. Ini berguna untuk mengambil barisbaris data berdasarkan posisinya dalam sekumpulan baris data hasil pemilihan. LIMIT mungkin diberikan dengan satu atau dua argumen, yang mana berupa bilangan bulat:
LIMIT jumlah_baris
LIMIT jumlah_diabaikan,jumlah_baris
jumlah_baris menunjukkan berapa banyak baris yang akan ditampilkan, sedangkan jumlah_diabaikan menunjukkan berapa banyak baris data yang pertama dari hasil pengambilan data yang harus diabaikan untuk tidak ditampilkan. Berikut ini contoh penggunaan klausa LIMIT untuk menampilkan dua baris data yang pertama :
Jika LIMIT diikuti oleh dua bilangan bulat, jumlah_diabaikan dan jumlah_baris, LIMIT akan mengabaikan sejumlah baris data yang pertama yang ditetapkan oleh bilangan bulat yang pertama ( jumlah_diabaikan), dan hanya akan menampilkan sejumlah baris data berikutnya sebanyak yang ditetapkan oleh bilangan bulat yang kedua ( jumlah_baris). 38 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
Untuk mengabaikan dua baris data yang pertama dan menampilkan dua baris data berikutnya dapat Anda lihat dalam contoh berikut:
2.13.1.5 Mengelompokkan pemilihan baris data menggunakan klausa GROUP BY Klausa GROUP BY digunakan untuk memperoleh suatu rangkuman atau ringkasan yang menghasilkan nilainilai untuk subgrup dari sekumpulan baris data yang dipilih.
Sebagai contoh kita memiliki tiga buah tabel yang terdiri dari tabel mahasiswa, matakuliah dan matakuliah_diikuti_mahasiswa. Skenario nya adalah kita akan menampilkan daftar mahasiswa beserta jumlah matakuliah yang diikutinya. Untuk itu jalankanlah query berikut ini:
Dan hasil nya sebagai berikut:
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 39
2.13.2 Perintah INSERT Perintah INSERT digunakan untuk menambahkan data baru kedalam tabel. Perintah INSERT memiliki dua buah format penulisan sebagai berikut: INSERT INTO nama_tabel (daftar_kolom) VALUES (daftar_nilai); INSERT INTO nama_tabel SET nama_kolom=nilai_kolom;
Pada format yang pertama nama_tabel menunjukkan nama tabel yang akan ditambahkan data kedalamnya, daftar_kolom menunjukkan namanama kolom dari tabel yang dipisahkan menggunakan tanda koma, selanjutnya daftar_nilai adalah nilainilai (dipisahkan dengan tanda koma) yang berhubungan dengan masingmasing kolom yang disebutkan dalam daftar_kolom (jumlah kolom harus sama dengan jumlah nilai).Pada format yang kedua setelah klausa SET adalah daftar pasangan nama kolom dan nilainya masingmasing yang dipisahkan menggunakan tanda koma. Salah satu dari kedua format penulisan tersebut memungkinkan untuk menambahkan beberapa data sekaligus dengan sebuah perintah Berikut ini contohcontoh penulisan perintah INSERT dalam proses panambahan data kedalam tabel mahasiswa.
40 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
Format penulisan perintah INSERT dengan menggunkan klausa SET tampak sebagai berikut:
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 41
Jika Anda ingin menambahkan beberapa data sekaligus kedalam tabel mahasiswa dengan sebuah perintah saja, maka Anda dapat lakukan hal tersebut sebagaimana dalam contoh berikut ini: 42 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
2.13.3 Perintah REPLACE Perintah REPLACE memiliki format penulisan perintah yang sama dengan INSERT, yaitu sebagai berikut: REPLACE INTO nama_tabel (daftar_kolom) VALUES (daftar_nilai); REPLACE INTO nama_tabel SET nama_kolom=nilai_kolom;
Perintah REPLACE mengembalikan sebuah informasi yang menunjukkan jumlah baris yang dipengaruhi. Jika jumlah baris yang dipengaruhi oleh perintah REPLACE adalah satu, maka baris data hanya di tambahkan kedalam tabel tanpa ada proses mengganti baris data yang ada. Jika jumlah baris data yang dipengaruhi oleh perintah REPLACE adalah dua baris, maka ada sebuah baris yang dihapus sebelum proses penambahan baris data dilakukan, lihat contoh berikut ini:
Keuntungan dari menggunakan perintah REPLACE adalah kita dapat menjalankan perintah DELETE dan INSERT sekaligus dalam sebuah operasi tunggal. Disini tidak ada kebutuhan untuk melakukan penguncian tabel secara eksplisit sebagaimana yang mungkin ada ketika Anda memutuskan untuk memisahkan perintah DELETE dan INSERT.
2.13.4 Perintah UPDATE Perintah UPDATE digunakan untuk merubah isi dari barisbaris data yang ada. Untuk menggunakannya, sebutkan nama tabel yang akan dirubah isi barisbaris datanya, sertakan klausa SET yang diikuti dengan daftar pasangan nama kolom dan nilainya , dan biasanya perintah UPDATE diikuti dengan klausa WHERE yang menentukan barisbaris data mana sajakah yang akan dirubah. Berikut ini format penulisan perintah UPDATE: UPDATE nama_tabel SET nama_kolom1=nilai1, nama_kolom2=nilai2.........WHERE .....;
Sebagai contoh dalam tabel mahasiswa, kita akan merubah nilai kolom alamat dari sebuah baris data yang memiliki mahasiswa_id=1016, sebagaimana yang tampak berikut ini:
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 43
2.13.5 Perintah DELETE Untuk menghapus barisbaris data yang ada dalam tabel, gunakanlah perintah DELETE. Perintah DELETE memungkinkan penggunaan klausa WHERE untuk menentukan baris baris data mana saja yang akan dihapus. Jika Anda tidak menyertakan klausa WHERE maka akan berakibat seluruh baris data yang ada dalam tabel akan dihapus, Untuk menghapus seluruh baris data yang ada dalam tabel format penulisannya seperti berikut ini: DELETE FROM nama_tabel;
Sedangkan untuk menghapus barisbaris data tertentu saja, format penulisannya seperti berikut ini: DELETE FROM nama_tabel WHERE ......;
Sebagai contoh, kita akan menghapus baris data yang ada dalam tabel mahasiswa yang memiliki mahasiswa_id=1016, seperti berikut ini:
44 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
2.14 Join tabel Pada dasarnya join tabel adalah mengkombinasikan dua buah tabel berdasarkan perbandingan nilainilai kolom yang dipilih. Join tabel menghasilkan barisbaris data yang hanya ada selama query itu dibuat atau dijalankan. Menggunakan join untuk secara temporer menciptakan barisbaris data yang lengkap dari suatu database yang membagi datadata yang berhubungan melalui atau ke beberapa tabel terpisah (hasil dari normalisasi).
2.14.1 Crossjoin Crossjoin antar dua buah tabel, mengambil data dari baris data dalam tabel 1 dan menggabungkannya dengan/ke setiap barisbaris data dari tabel 2. Hal ini dapat dilakukan dengan dua format penulisan, seperti contoh berikut:
mysql> SELECT nama_matakuliah, nama_depan FROM matakuliah, mahasiswa; mysql> SELECT nama_matakuliah, nama_depan FROM matakuliah CROSS JOIN mahasiswa;
2.14.2 Inner Join Dalam suatu Inner join, perbandingan dibuat antara dua kolom yang memiliki nilai yang sama. Gunakan metode ini untuk memilih kolomkolom tertentu dari kedua tabel, dan hanya barisbaris data yang benar saja yang digabungkan. Inner join dapat ditulis dengan menggunakan dua format penulisan yang brebeda. Pada salah satu format daftar tabeltabel yang digabungkan dipisahkan dengan tanda koma. Sedangkan pada format penulisan yang lainnya menggunakan klausa INNER JOIN. Kedua format akan menampilkan hasil yang sama:
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 45
Dan hasil query sebagai berikut:
2.14.3 Outer Join Gunakan outer join untuk menuliskan join tabel yang menyediakan informasi tentang barisbaris data yang tidak sesuai atau hilang. Sebuah outer join dapat menemukan baris baris data yang sesuai (seperti inner join) , tetapi dapat juga mengidentifikasi barisbaris data yang tidak sesuai. Selanjutnya, dengan menyertakan klausa WHERE, suatu outer join dapat menyeleksi baris data yang sesuai untuk hanya menampilkan barisbaris data yang tidak sesuai atau tidak cocok. Dua buah bentuk outer join yang umum yaitu left join dan right join. Disini dalam penulisan perintahnya menggunakan klausa LEFT JOIN atau RIGHT JOIN dari pada menggunakan operator tanda koma atai klausa INNER JOIN. Left atau right join dapat menjawab pertanyaanpertanyaan yang sama, dan hanya sedikit berbeda dalam penulisan perintahnya. 2.14.3.1 Left Join LEFT JOIN menampilkan nilainilai yang hilang dan/atau yang tidak sesuai dalam tabel kedua:
46 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
Left join sangat berguna ketika kita ingin mendapatkan hanya barisbaris data yang ada dalam tabel sebelah kiri yang tidak muncul dalam tabel sebelah kanan. Dengan menambahkan klausa WHERE yang hanya akan mencari barisbaris data yang ada dalam tabel sebelah kanan yang memiliki nilai NULL, maka penulisan perintah dan hasilnya akan tampak seperti berikut:
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 47
2.14.3.2 Right Join RIGHT JOIN menampilkan nilainilai yang hilang dan/atau yang tidak sesuai dalam tabel pertama:
2.15 Referensi MySQL Manual (http://mysql.com)
48 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
III. Administrasi MySQL
3.1 Cara Download dan Install MySQL Step 1 :Sebelum menginstall, Anda harus mendownload versi terakhir dari MySQL. Pada contoh ini versi yang kita gunakan versi 4.0.10 yang di dapat dari situs web MySQL. Catatan : Menginstall juga dimungkinkan dari paket RPM, tapi cara terbaik adalah dengan meng compile sourcenya secara langsung, karena metode ini dapat memberikan fleksibilitas yang lebih baik, opsiopsi yang kita tentukan sendiri dan kecepatan.
Step 2 : Anda harus menentukan terlebih dahulu dimana Anda akan menyimpan file downloadan. Pada contoh installasi ini, diasumsikan file download tersebut terletak di /software/. Jika direktori tersebut belum ada, buatlah dengan perintah :
Sekarang kita akan membuat folder untuk menaruh file MySQL dari hasil downloadan. Ketik perintah berikut :
Catatan : Panduan instalasi berikut ini mendukung Perl dan OpenSSL
Step 3 :Jika Anda sudah memiliki file installasi RPM, sebaiknya Anda menguninstall RPM tersebut sebelum memulai proses. Hal pertama yang harus dilakukan untuk memeriksa apakah file RPM MySQL tersebut sudah terinstall atau belum, dengan mengetikkan perintah : rpm -qa | grep -i mysql Jika tidak ada sesuatupun yang ditampilkan, berarti RPM MySQLbelum terinstall, dan Anda bisa langsung melanjutkan ke step 4. Jika tidak, perhatikan baikbaik daftar yang ditampilkan oleh perintah tadi, yang biasanya terlihat seperti berikut :
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 49
Untuk menghapus, gunakan perintah rpm e [nama paketnya]. Ulangi perintah untuk tiap tiap paket. Contoh :
Jika ragu, Anda bisa menyertakan seluruh entry termasuk nomor versi. Sebaiknya, Anda perlu mengetahui keseluruhan entry secara jelas terlebih dahulu, yang sudah ditampilkan sebelumnya seperti contoh tadi. Catatan Penting : Urutan yang harus Anda ikuti yaitu untuk menghapus MySQL paling terakhir, dengan MySQLclient sebelumnya. Paket lainnya tidak masalah jika di hapus terlebih dahulu. Dibawah ini contoh urutanurutan penghapusan paket :
Jika Anda mendapatkan error, hampir pasti terjadi dikarenakan masalah dependensi (ketergantungan satu paket terhadap paket lain). Error yang mungkin terjadi seperti berikut ini :
Untuk mengatasi hal tersebut, coba hapus terlebih dahulu paket yang bergantung pada paket yang akan Anda hapus. Jika masih gagal dan Anda mendapatkan dependencies errors, hapus paket tersebut dengan menggunakan perintah : shell> r pm e nodeps nama paketnya
Kita juga harus menghentikan service mysql jika sedang berjalan dengan perintah : shell> service mysqld stop
atau shell> pkill mysql Step 4 : Step selanjutnya yaitu unpack, compile dan install MySQL dari file source yang 50 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
didapatkan dari proses download sebelumnya. Ketik perintah berikut :
shell> tar zxvf *.tar.gz shell> cd mysql4.0.10gamma shell> ./configure prefix=/usr sysconfdir=/etc localstatedir=/var/lib/mysql mandir=/usr/share/man infodir=/usr/share/info withmysqlduser=mysql withopenssl withtcpport=3306 withunixsocket path=/var/lib/mysql/mysql.sock shell> make shell> make install shell> cp supportfiles/mysql.server /etc/rc.d/init.d/mysqld shell> chmod 755 /etc/rc.d/init.d/mysqld shell> chkconfig –add mysqld shell> cd .. shell> r m rf mysql4.0.10gamma shell> cd ..
Step 5 : Setelah instalasi selesai, kita perlu men setup MySQL dengan mengetikkan perintah :
shell> groupadd mysql shell> useradd mysql –c “MySQL Server” –d /var/lib/mysql –g mysql shell> scripts/mysql_install_db shell> chown –R mysql:mysql /var/lib/mysql shell> ser vice mysqld start shell> /usr/bin/mysqladmin –u root password ‘newpassword’
Step 6 : Jika mysql server gagal merespon saat mencoba start, copy file .cnf ke /etc/my.cnf. Konfigurasi dari mysql terdapat pada file tersebut. mysql sebaiknya mulai aktif saat sistem boot.
3.2 Direktori Data MySQL Direktori data tempat dimana mysql server menyimpan databasedatabase dan file status, serta menyediakan informasi tentang operasi server. Mengetahui dan mengerti tentang struktur dan isi dari direktori data merupakan hal yang penting agar Anda dapat memahami bagaimana server menggunakan file system untuk merepresentasikan databasedatabase dan tabletable, serta dimana loglog(catatancatatan) diletakkan. Secara default, semua data di atur oleh mysql server.
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 51
3.2.1 Lokasi Direktori Data Defaultnya, direktori data di compile ke : /var/lib/mysql atau /usr/local/mysql Letak dari direktori data secara eksplisit dapat diarahkan dengan merubah datadir di file my.cnf
3.2.2 Struktur Direktori Data MySQL direktori data mengandung semua database dan tabletable yang diatur oleh server. Mereka disusun seperti struktur diagram pohon, yang diimplementasikan dengan mengambil keuntungan struktur hirarki dari UNIX atau Ms. Windows file sistem.
Tiaptiap database disesuaikan dengan direktori di bawah direktori data Tabletable bawaan database disesuaikan dengan filefile dibawah direktori database
3.2.3 Bagaimana MySQL Server memberikan akses ke Data
52 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
Dimana Tab1 atau table lain dalam gambar sebelumnya dijelaskan sbb :
3.2.4 Representasi dari Tabel Database Tiap tabel dalam database yang ada, memiliki tiga file yang terletak pada direktori data.Tiga file pada direktori tersebut yaitu : file form(deskripsi), file data dan file index. Nama pada file tersebut menunjuk ke table dan masingmasing nama ekstension mengindikasikan tipe file.
3.3 StartUp dan Shutdown MySQL Tujuan dari administrasi MySQL yaitu untuk memastikan bahwa server berjalan dan client dapat mengaksesnya. Adakalanya server sebaiknya dimatikan ( Jika Anda menempatkan database, suatu saat Anda tidak ingin server mengupdate tabel di database tersebut). Untuk mengatasi kasus tersebut, Anda perlu melakukan startup (mengaktifkan) atau shutdown (mematikan) server, jadi Anda harus memiliki kemampuan untuk melakukan salah satu dari tugastugas tadi dan memutuskan mana yang perlu dilakukan untuk kasus tersebut.
3.3.1 MySQL server dan Skripskrip MySQL server (mysqld) adalah program utama yang banyak bekerja dalam instalasi MySQL. Server adalah kumpulan dari beberapa skrip yang saling berhubungan yang melakukan operasi setup ketika Anda menginstall MySQL, atau programprogram yang membantu Anda dalam menghidupkan dan mematikan server.
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 53
3.3.1.1 Sekilas pandang terhadap Skrip Serverside Programprogram MySQL memiliki opsi berbeda. Tetapi, semua program tersebut menyediakan opsi help yang bisa Anda gunakan untuk melihat penjelasan dari program opsi tersebut. shell> mysqld help
Dalam commandline atau dalam file opsi, opsi default dari semua standard program dapat diabaikan dengan melakukan opsi tertentu. Tabel dibawah ini memberi penjelasan singkat dari server MySQL dan program serverrelated: Serverside script mysqld
Penjelasan Sebuah daemon SQL, atau mysql server, program ini harus running agar client dapat mengakses database dengan melakukan koneksi ke server.
mysqldmax
Versi dari server yang menyediakan feature tambahan
mysqld_safe
Script untuk mengaktifkan server, mysql_safe akan mencoba menghidupkan mysqldmax jika ada, dan mysqld
mysql.server
Script untuk mengaktifkan server, script ini digunakan pada sistem operasi yang memiliki direktori run berisi banyak script berfungsi untuk mengaktifkan system services pada run level tertentu. Script ini juga berfungsi untuk memanggil mysqld_safe untuk mengaktifkan mysql server
mysqld_multi
Script untuk mengaktifkan server, yang dapat mengaktifkan dan menonaktifkan multi server yang diinstall di sistem.
mysql_install_db
Script ini membuat grant table mysql dengan privileges yang masih standard. Biasanya dieksekusi sekali saja ketika menginstall mysql
54 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
mysql_fix_privilege_tables
Skrip ini digunakan untuk mengupdate tiap perubahan yang terjadi di table grant mysql versi baru. Skrip ini dijalankan setelah selesai melakukan instalasi upgrade
3.3.1.2. Mengaktifkan Server INVOKE (memanggil) mysqld secara langsung. Ini adalah salah satu cara mutakhir yang umum. INVOKE mysqld_safe atau safe_mysqld. mysqld_safe mencoba untuk menentukan lokasi dari program server dan direktori data kemudian invoke server sesuai opsi yang mengggambarkan nilai yang ditentukan sebelumnya (di skrip mysqld_safe).
3.3.1.3 Jika tidak bisa terhubung ke server Adakalanya kita menghadapi situasi dimana kita tidak dapat terhubung ke server, karena kasus seperti berikut :
Lupa password root Koneksi ke localhost melalui file domain socket UNIX, di /tmp/mysql.sock
Lupa Password root Password root, bisa saja terlupa karena kesalahan yang tidak disengaja. Dalam kasus ini, Anda perlu mengambil alih kendali server kemudian mereset password. Langkahlangkahnya sbb :
Matikan server
Anda bisa mematikan server dengan menggunakan perintah kill diikuti nomor proses ID nya. Contoh :
shell> kill 5662
Catatan : Untuk melihat proses ID (PID) dari proses yang aktif, dalam kasus ini apakah mysql aktif atau tidak dengan perintah :
shell> ps waux | grep mysql
RESTART server dengan tambahan opsi skipgranttables Panduan Pendayagunaan Open Source Software: RDBMSMySQL 55
Opsi tadi digunakan untuk memberi tahu server agar tidak mengaktifkan grant tabel saat melakukan verifikasi koneksi. Hal ini mengizinkan Anda untuk terhubung ke server tanpa password root. Setelah Anda terhubung, barulah Anda bisa merubah password root.
Setelah merubah password gunakan perintah flush privileges.
Restart Server.
Ketika file socket hilang Jika Anda tidak bisa melakukan koneksi ke server dikarenakan file socket yang hilang, Anda bisa mendapatkan kembali dengan merestart server, karena server membuat ulang kembali setiap melakukan startup, Trik disini bahwa Anda tidak bisa menggunakan socket untuk melakukan koneksi karena file socket hilang, maka Anda harus melakukan koneksi melalui TCP/IP : mysqladmin –u root –p ‘pass’ –h ‘ipaddr/hostname’ shutdown
Restart kembali server setelah perintah tadi.
3.4 Manajemen User Account MySQL Bagian ini menjelaskan bagaimana cara untuk melakukan setup account pada MySQL server. Bagian ini juga menjelaskan bagaimana cara yang aman dalam membuat account baru serta cara untuk menentukan hak izin tiaptiap user.
3.4.1 Username dan Password Account MySQL digunakan untuk mendefinisikan username, host klien atau banyak host yang menentukan user mana saja yang bisa terhubung ke server. Account juga memiliki password. Ada beberapa perbedaan antara mysql dan sistem operasi dalam membuat username dan password.
Username, oleh mysql digunakan untuk otentikasi, tidak ada hubungan antara login name di Sistem Operasi seperti Ms.Windows atau UNIX. Pada UNIX, umumnya, secara default, MySQL klien bisa menggunakan username UNIX sebagai username MySQL, demi kemudahan penggunaannya. Default tersebut bisa di ubah dengan mudah, dengan opsi –u atau user. Artinya setiap orang bisa dengan mudah terhubung atau menggunakan database yang ada di mysql, sehingga database menjadi kurang aman, kecuali setiap user di mysql sudah memiliki password. Panjang karakter dari username mysql maximum 16 digit. Username pada sistem operasi mungkin bisa berbeda panjangnya.
56 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
Password MySQL tidak ada hubungannya dengan password saat Anda login ke sistem operasi. Enkripsi password pada MySQL menggunakan algoritmanya sendiri. Enkripsinya berbeda dengan enkripsi di sistem UNIX. Enkripsi di MySQL menggunakan fungsi PASSWORD() . Password pada sistem UNIX di enkripsi menggunakan fungsi ENCRYPT(). Mulai versi 4.1, MySQL menggunakan metode yang lebih bagus dalam metode autentikasi, dengan melakukan proteksi password selama proses koneksi. Hal ini menjadikannya lebih aman, bahkan jika paket TCP/IP di ‘bajak’ atau database mysql di capture. Pada versi sebelumnya, password yang sudah disimpan bahkan dalam form yang terenkripsi, pengetahuan tentang enkripsi data tersebut dapat digunakan untuk koneksi ke MySQL server.
Ketika Anda sudah mengaktifkan mysql server dan ingin masuk ke lingkungan mysql, Anda bisa menggunakan command line untuk menentukan account : [root@sms mysql]# mysql —u irfan –p database_saya Enter password :
Anda diminta untuk memasukkan password, jika user tersebut belum memiliki password, cukup dengan mengetikkan perintah : [root@sms mysql]# mysql—u irfan database_saya Pada perintah diatas, setelah –u adalah nama user yang terdaftar di mysql server, dan database_saya adalah nama database yang bisa di akses oleh user tersebut. Pada beberapa system, library nya memanggil MySQL yang secara otomatis mengeset batas untuk pengisian password di promptnya sebatas delapan digit. Masalah seperti itu ada pada library system, bukan MySQL. Untuk mengatasinya, ubahlah password di MySQL maksimal delapan digit.
3.4.2 Menambah user account baru Untuk membuat account baru, ada dua cara :
Menggunakan statement GRANT
Memanipulasi langsung MySQL table Agrant
Metode yang lebih disarankan adalah dengan menggunakan statement GRANT, karena Panduan Pendayagunaan Open Source Software: RDBMSMySQL 57
lebih ringkas, dan kemungkinan lebih sedikit mendapatkan kesalahan. GRANT mulai tersedia pada MySQL versi 3.22.11. Sintaksnya secara jelas digambarkan di MySQL Language Reference yang bisa Anda lihat di http://dev.mysql.com/doc/refman. Opsi yang lain adalah dengan menggunakan beberapa tools yang tersedia dari pihak ketiga. Tools tersebut biasanya menyediakan kemampuan untuk administrasi MySQL. Contohnya seperti PHPMyAdmin. Contoh berikut ini, adalah bagaimana cara menambah user baru. Untuk melakukannya Anda harus terhubung ke MySQL sebagai user root. Root adalah user dengan status/hak paling tinggi dalam sistem mysql.
Jika root telah memiliki password, Anda harus menambah opsi –p. Dengan perintah tadi kita akan masuk ke lingkungan mysql server sebagai root. Setelah terhubung, Anda bisa menambah account baru. Statement berikut ini menggunakan GRANT untuk mensetup nya : Maksud dari perintahperintah diatas yaitu :
Dua account memiliki username sarah dan password mumtaza. Kedua user tersebut memiliki privilege (hak) penuh untuk melakukan apa saja seperti super user (root). Satu account (‘sarah’@’localhost’) hanya bisa digunakan saat Anda login di komputer local (localhost), sedang satu account lagi (‘sarah’@’%’) bisa dari host(komputer) mana saja. Kadang diperlukan untuk memiliki account yang bisa terhubung ke mysql dari mana saja. Jika user sarah tidak memiliki account localhost, maka ketika user tersebut login di localhost dia akan diperlakukan seperti anonymous user, yaitu user yang secara default disediakan saat kita menjalankan mysql_install_db waktu menginstall mysql. Alasannya karena anonymous user lebih sesuai nilai kolom host nya, dan juga saat penyusunan baris di table terletak lebih awal. Account yang berikutnya, username nya adalah admin, tanpa password. Account ini
58 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
hanya bisa digunakan dari localhost. Dengan pemberian privileges RELOAD dan PROCESS. Privilege ini memberikan user admin kemampuan untuk mengeksekusi mysqladmin reload, mysqladmin refresh, mysqladmin flushxxx, seperti perintah yang ada pada mysqladmin processlist. User ini tidak diberikan hak untuk meng akses database. Anda bisa menambahkan hak tersebut dengan statement GRANT nantinya.
User berikutnya adalah dummy tanpa password. User ini juga hanya bisa terkoneksi melalui localhost. Tidak diberikan hak apapun. Perintah USAGE berguna untuk membuat account baru tanpa memberi hak apapun terhadap user yang dibuat tersebut, jadi hanya membuat account saja. Privileges /hak global dari user ini adalah ‘N’. Anda tetap bisa merubah dan memberikan priveleges secara spesifik nantinya.
Alternatif dari perintah GRANT yaitu perintah INSERT, seperti perintah query biasa, yang digunakan untuk menambah data ke tabel GRANT.
Kegunaan dari Flush Privileges yaitu untuk memberitahu server agar membaca kembali table GRANT, jika tidak maka perubahan tidak berlaku sampai Anda merestart kembali server. Tapi, dengan perintah GRANT, Flush Privileges tidak diperlukan. Fungsi PASSWORD() diatas, digunakan untuk mengenkripsi password saat melakukan proses INSERT, tapi pada perintah GRANT, fungsi PASSWORD() tidak diperlukan. Nilai ‘Y’ yang dimasukkan saat proses INSERT tadi, untuk mengaktifkan account privileges. Banyaknya nilai ‘Y’ yang dimasukkan bergantung pada versi database mysql Panduan Pendayagunaan Open Source Software: RDBMSMySQL 59
Anda. Versi sebelumnya (3.22.11) lebih sedikit kolom privileges daripada versi 4.0.x. Pada proses INSERT untuk user dummy, hanya host,user dan password yang diberi nilai, sedang yang lainnya tidak. Kolom yang tidak diberi nilai pada saat proses INSERT akan diberi nilai default ‘N’. Hal ini sama dengan statement GRANT USAGE sebelumnya. 3.4.2.1 Akses ke Database Pada contoh selanjutnya, kita akan membuat tiga account, dan memberikan izin untuk mengakses ke database yang spesifik.
Tiga account tadi adalah user yang sama, yaitu ismail dengan password 4bd4nsy4kr. Penjelasan dari tiga statement tadi sebagai berikut :
User ini dapat mengakses database mahasiswa, hanya dari localhost. Account yang kedua, dapat mengakses database finance, tapi hanya dari host nf.com Account yang ketiga, dapat mengakses database pustaka tapi hanya dari host server.domain
3.4.2.2 Akses Tabel Izin akses table digunakan untuk mengatur izin akses table yang terdapat pada database yang ditentukan, konfigurasi akses ini terletak pada table tables_priv pada database mysql. Table tersebut menyediakan perintah izin akses SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT, REFERENCES, INDEX dan ALTER. 60 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
Untuk melakukan izin akses table, gunakan perintah berikut :
stmik adalah nama database, dan mahasiswa adalah tablenya. Perintah diatas, maksudnya yaitu, user irfan hanya dapat melakukan perintah SELECT pada table mahasiswa.
3.4.2.3 Akses Kolom Seperti namanya, izin ini hanya akan membolehkan melakukan akses ke kolom/field yang disebutkan saja. Konfigurasi akses ini terletak pada table columns_priv. Izin akses nya antara lain SELECT,INSERT,UPDATE dan REFERENCES. Contoh penggunaannya:
Artinya, user diatas hanya dapat melakukan perintah UPDATE saja pada field nama, di table mahasiswa. Anda juga dapat melakukan kombinasi antara perintah untuk mengakses table dan field, misal Anda ingin bisa melakukan SELECT atau melihat semua field yang ada pada suatu table, tapi hanya field tertentu saja yang bisa di UPDATE. Contoh:
3.4.3 Menampilkan Izin Akses Untuk mengetahui izin akses pada user, ketikkan perintah berikut :
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 61
Hasil yang Anda dapatkan mungkin berbeda, tergantung pada izin akses yang Anda lakukan sebelumnya. Untuk contoh diatas, keluaran yang dihasilkan sesuai dengan pengesetan GRANT USAGE untuk user dummy sebelumnya.
3.4.4 Menghapus Account User
Penggunaan Revoke REVOKE merupakan kebalikan dari GRANT, yaitu untuk menghapus izin akses pada user tertentu yang sebelumnya sudah diberikan. Untuk menghapus izin akses secara penuh, gunakan perintah berikut :
Perintah diatas akan mencabut lagi izin akses penuh user sarah. Anda juga bisa menghapus user dengan menggunakan perintah DELETE :
Perintah tadi akan menghapus user umam. Walaupun user tersebut sebelumnya diberi hak untuk mengakses suatu table, tapi dengan dihapus keberadannya dari table GRANT mysql, dia tetap tidak akan bisa masuk lagi (login) ke server. Untuk menghapus akses ke database gunakan perintah berikut :
62 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
Perintah tersebut akan menghapus izin akses ke database mysql. Untuk menghapus izin akses table gunakan perintah berikut :
Perintah tersebut akan menghapus izin akses user irfan pada table mahasiswa di database stmik. Untuk menghapus izin akses field gunakan perintah berikut :
Perintah tersebut akan menghapus izin UPDATE field nama pada table mahasiswa di database stmik. Selain bisa menambah, mendelete dan memberi izin akses pada useruser di MySQL, Anda juga bisa melakukan pantauan terhadap useruser tersebut dengan mengetikkan perintah berikut : mysql> SHOW PROCESSLIST;
Pada tampilan diatas, nampak useruser yang sedang mengakses MySQL Sever. Perintah tersebut akan menampilkan hasil yang berbeda jika dilakukan oleh user yang tidak memiliki akses super privileges. Dengan kata lain, user biasa hanya akan menampilkan dirinya sendiri saat menampilkan hasil dari perintah tersebut.
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 63
Selanjutnya setelah Anda mengetahui user apa saja yang sedang aktif mengakses server, Anda dapat melakukan pengontrolan terhadap user tersebut dengan mengetikkan perintah KILL dilanjutkan dengan id dari user tersebut yang nampak pada table diatas. KILL digunakan untuk memutuskan hubungan sementara sampai user tersebut melakukan koneksi lagi. Sebagai contoh, user tamu melakukan koneksi ke database mysql yang seharusnya tidak dilakukannya. Anda dapat memutuskan koneksi tersebut dengan mengetikkan perintah :
Begitu user tamu ingin melakukan perintah SELECT, hasilnya akan tampak seperti ini :
3.4.5 Membatasi jumlah penggunaan resource Anda bisa membatasi penggunaan resource dari server untuk masingmasing account, sbb
Jumlah query yang bisa dihasilkan oleh account per jam
Jumlah pengupdatean yang bisa dihasilkan oleh account per jam
Jumlah koneksi (berapa kali) yang dapat dilakukan oleh account ke server selama sejam.
Hal yang perlu Anda perhatikan sebelum melakukan pembatasan resource ini, tabel yang bernama user yang berada pada database mysql harus memiliki kolom(field) dari resource resource tersebut. Kolom nya antara lain, max_questions,max_updates dan max_connections. Jika belum ada, berarti Anda harus mengupgrade mysql Anda. Untuk merubah batasbatas dari resource tadi, Anda bisa menggunakan statement GRANT, ditambahkan dengan klausa WITH. Contoh dibawah ini, user vina hanya bisa melakukan koneksi sebanyak dua kali selama satu jam di database stmik.
64 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
Jika user tersebut melakukan koneksi lebih dari dua kali selama satu jam, maka koneksi ketiga akan diabaikan oleh mysql server.
Pada defaultnya, nilai dari batasbatas resource tadi adalah 0, yaitu tak terbatas. Untuk merubahnya dengan memberikan nilai integer untuk membuat perhitungannya/batasnya. Jadi untuk mengembalikan batas agar menjadi tak terbatas lagi, dengan memberikan nilai 0 pada resource yang akan Anda ubah.
3.5 Mengatasi Kerusakan Data dan Recovery Bagian ini akan menjelaskan bagaimana membackup database dan melakukan maintenance terhadap table.
3.5.1 Backup Database
Jika suatu saat kerusakan sistem terjadi, Anda menginginkan agar bisa mengembalikan kembali status tabletable yang ada tersebut ke keadaan saat sebelum rusak, dengan kemungkinan sebagian kecil data saja yang hilang. Pengguna, mungkin saja tanpa sengaja menghapus table atau database, dan menginginkan agar data mereka bisa kembali. Seorang adiministrator mungkin mencoba untuk mengedit table melalui normal editor, sayangnya hal itu kemungkinan bisa menyebabkan kerusakan table. Kerusakan HardDisk secara tibatiba biasa terjadi, dan memiliki satu backup database paling terakhir membuat proses recovery menjadi lebih mudah.
3.5.2 Prinsipprinsip Backup
Lakukan backup secara rutin, dengan membuat jadwal back up.
Instruksikan server untuk mengupdate log (catatan). Update log melakukan Panduan Pendayagunaan Open Source Software: RDBMSMySQL 65
penambahan pada dump. Catatan ini yang nantinya dibutuhkan untuk mengembalikan database ke status akhirnya saat sebelum database tersebut rusak.
Gunakan FLUSH LOGS untuk memastikan bahwa update log terbaru sesuai dengan file backup. Gunakan nama file yang konsisten dan mudah dimengerti dengan menyertakan tanggal membackup nya. Contoh : COBA_DB.200060606
Simpan file backup Anda pada file system yang berbeda.
Backup file backup Anda menggunakan file system backup.
3.5.3 Metode Backup Ada tiga cara melakukan backup:
Copy secara langsung
mysqldump
mysqldhotcopy
3.5.3.1 Copy secara langsung
Mysql menyimpan informasi database di subdirectori pada direktori data.
Melibatkan penyalinan direktori dari server.
Sangat cepat (seperti menyalin file)
Harus mengunci table dari acces penulisan, atau menon aktifkan server sebelum menyalin file Tidak terlalu portable (mudah dipindahpindah)
3.5.3.2 mysqlhotcopy
mysqlhotcopy dibuat oleh Tim Bunce dalam script PERL. Tools ini menggunakan LOCK TABLES,FLUSH TABLES dan CP atau SCP untuk membackup file dengan cepat. Ini merupakan cara tercepat untuk membackup database atau single table, tapi hanya bisa berjalan dalam mesin yang sama dimana database direktori terletak. Hanya bekerja di table tipe MyISAM.
66 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
Perhatikan syntax berikut : shell> mysqlhotcopy db_name [/path/to/new_directory] shell> mysqlhotcopy db_name1 … db_name_n [/path/to/new_directory]
Anda juga bisa mengcopy semua file table (filefile *.frm,*.MYD,*.MYI) selama server tidak mengupdate apapun. mysqlhotcopy menggunakan metode tersebut. Proses ini tidak dapat bekerja jika dalam database tersebut memiliki tipe table InnoDB, dikarenakan table InnoDB tidak menyimpan datanya di direktori data . 3.5.3.3 mysqldump
Memperoleh data dari table dan/atau skema menggunakan perintah SQL .
Bisa dipindah antara versi MySQL yang berbeda
Mengizinkan juga untuk dipindah ke database yang lain.
Lebih lambat jika dibandingkan dengan mysqlhotcopy
Hasil dari file backup cukup besar (text SQL), tapi bisa di kompress ke bzip atau gzip.
Syntax : mysqldump [options] db_name [tables] > backupfilename mysqldump [options] databases > backupfilename mysqldump [options] –alldatabases > backupfilename mysqldump [options] db_name [tables] > backupfilename
Diasumsikan, data yang akan di backup adalah table buku di database pustaka, perintahnya :
Catatan : user yang bisa melakukan backup dengan metode mysqldump adalah user yang memiliki izin ke database atau table tersebut.
Opsi – opsi mysqldump Opsi
Penjelasan
mysqldump pustaka | gzip > /tmp/backup.gz
Untuk meng kompress file output SQL
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 67
nocreatedb
Perintah ‘CREATE DATABASE /*!32312 IF NOT EXIST*/ db_name’; tidak akan disertakan dalam output SQL, tapi tetap akan disertakan jika opsi alldatabases atau databases diberikan pada perintah mysqldump sebelumnya. Syntax : mysqldump nocreatedb db_name > backupfilename
nocreateinfo
Tidak menuliskan perintah CREATE TABLE untuk tiaptiap table yang di salin. (digantikan dengan perintah ALTER) Syntax: mysqldump nocreateinfo backup >backupfilename
nodata
tidak menuliskan data apapun ke baris pada table. Ini berguna jika Anda hanya ingin mendapatkan struktur dari table tanpa isi nya Syntax : mysqldump nodata db_name > backup filename
Dumping lebih dari satu database Syntax: mysqldump databases db1 db2 > backupfilename Restore Database
Buat database kosong yang baru, bisa dari commandline atau dari prompt.
Arahkan path ke direktori tempat Anda menyimpan file backup sebelumnya, kemudian ketik perintah berikut :
68 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
3.6 Replikasi Replikasi memungkinkan tersedianya database lain yang keadaannya mendekati sama dengan database tempat pertamakali terjadinya update data. Database lain itu disebut slave dan database tempat pertamakali terjadinya update disebut master.
3.6.1 Memanfaatkan Replikasi pada MySQL versi 5.0 Contoh berikut, kita akan menggunakan mysql versi 5.0, diharapkan pengetahuan kita terhadap mysql menjadi makin bertambah. Tujuan dari pembuatan replikasi yaitu : •
Melakukan recovery jika suatu saat master crash atau terjadi kesalahan eksekusi
•
Mengetahui potensipotensi dari replikasi sekaligus menghindari kondisikondisi yang dapat menyebabkan masalah ketika menggunakan replikasi akibat keterbatasan keterbatasan dalam sistem replikasi tersebut.
3.6.2 Menginstall MySQL versi 5.0 dan mensetupnya sebagai server master 3.6.2.1 Install MySQL server di mesin master : • Mesin master adalah server linux. • IP Address adalah 192.168.1.197 • Direktori instalasi di /usr/local/myslq5 • Direktori data di /data/mysqldev Berikut cara instalasinya : 1. Download mysql5 dari www.mysql.com, simpan di /home/irfan
2. Ekstrak file distribusi .tar.gz di /usr/local 3. Buat simbolik link : Panduan Pendayagunaan Open Source Software: RDBMSMySQL 69
4. Buat user mysql :
5. Setup PATH, agar dapat diakses semua user, edit /etc/profile, tambahkan :
6. Inisialisasi direktori data (datadir) ke /data/mysqldev :
7. Selesai
3.6.2.3 File Konfigurasi File konfigurasi disimpan sebagai /etc/my5.cnf, berikut ini parameter konfigurasi umum (bukan spesifik master):
Selanjutnya, parameter berikut ini diperlukan untuk server bertindak sebagai master: 1. logbin=mysqlbinlog
Digunakan untuk mengaktifkan binary log
2. serverid=1 3. syncbinlog=1 synchronize setiap database update dengan binary log sesering mungkin.
70 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
Berikut ini file konfigurasi selengkapnya:
3.6.2.4 Menjalankan server master Selanjutnya anda perlu menjalankan server dan memeriksanya: 1. Agar server beroperasi di background, jalankan :
2. Login ke mysql sebagai root di mysql (bukan root di system):
3. Periksa apakah server sudah berjalan sebagai master, jalankan:
Akan muncul tampilan seperti ini:
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 71
Kemungkinan hasilnya akan berbeda di komputer Anda. Coba simpan informasi diatas, karena akan dipergunakan sebagai parameter di server slave.
3.6.2.5 Menyeting hak akses untuk replikasi Berikut ini akan didefinisikan setup agar user 'replikator' dapat mengakses master untuk melakukan replikasi. Dalam hal ini slave akan dioperasikan dari mesin dengan IP address 192.168.1.55. Jalankan perintah berikut: (masih di server master) 1. Login ke mysql sebagai mysql root 2. Jalankan perintah berikut di prompt mysql
3.6.2.6 Membuat arsip base backup Base backup atau backup dasar adalah seluruh isi file system dari data yang akan dibackup, file system bisa mencakup seluruh direktori data (datadir) atau bisa juga hanya satu atau lebih direktori database tertentu, yang ada dibawah datadir. Target replikasi pada setup ini adalah seluruh database di master, jadi perlu dibuat base backup dari isi direktori data (datadir) di /data/mysqldev. Berikut ini caranya: 1. Pastikan database dalam keadaan readonly. Login sebagai mysql root lalu jalankan:
Perhatikan bahwa setelah anda menjalankan perintah ini, pengguna tidak dapat melakukan 72 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
INSERT, UPDATE dan DELETE ke database. 3. Lihat posisi binary log, catat parameter File dan Position:
Misalkan tampil sebagai berikut:
4. Gunakan tar untuk membuat file arsip base backup, nama file arsip sebaiknya menggunakan parameter File dan Position, supaya selfdocumented, misal backup_mysqlbinlog.000003_98.tgz. Jika datadir adalah /data/mysqldev, maka jalankan:
5. Setelah file arsip selesai dibuat, buka kuncian database dari akses readonly:
3.6.3 Setup server Slave 3.6.3.1 Instal mysql server di mesin slave •
Mesin master adalah linux server
•
IP address 192.168.1.55
•
Direktori instalasi /usr/local/mysql5
•
Direktori data di /data/slave
Tahap instalasi hampir sama dengan instalasi master dibagian sebelumnya, perbedaannya adalah langkah ke 6 (enam), yaitu inisialisasi datadir tidak diperlukan karena kita akan Panduan Pendayagunaan Open Source Software: RDBMSMySQL 73
menggunakan base backup sebagai datadir.
3.6.3.2 Setup datadir dari arsip base backup. Sekarang kita akan membuat datadir berdasarkan base backup dari server master: 1. Copy file arsip base backup ke slave, dapat menggunakan scp atau ftp. 2. Dekompres file arsip 3. Rename direktori, langkah ini sebenarnya tidak mutlak diperlukan, kita hanya ingin nama direktori yang memberikan petunjuk bahwa yang tersimpan adalah data dari slave dalam proses replikasi. 4. Ubah kepemilikan datadir untuk user mysql, tentunya user mysql ini sudah harus ada di server slave. 3.6.3.3 File konfigurasi File konfigurasi disimpan sebagai /etc/slave_my.cnf, berikut ini parameter konfigurasi umum (bukan spesifik slave):
Selanjutnya, parameter berikut ini disarankan untuk server bertindak sebagai slave: 1. skipslavestart Mencegah slave start otomatis jika mesin server restart. 2. readonly Mencegah slave diupdate dari luar proses replikasi, karena dapat menyebabkan ketidaksinkronan database. 3. logwarnings Mencatat warning dalam proses replikasi 4. serverid=2
74 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
identitas server harus berbeda dengan master 3.6.3.4 Menjalankan server slave Selanjutnya anda perlu menjalankan server dan memeriksanya: 1. Agar server beroperasi di background, jalankan :
2. Login ke mysql sebagai root di mysql (bukan root di system):
3. Periksa apakah server sudah berjalan sebagai master, jalankan: Pada kolom Slave_IO_State anda akan mendapati nilai kosong, karena thread slave belum berjalan. 3.6.3.5 Setup parameter replikasi Slave perlu diberi informasi tentang alamat (ip address), file binary log, posisi file master dan informasi otentikasi untuk mengakses master, caranya: 1. Login ke server slave sebagai mysql root. 2. Jalankan perintah :
Parameter replikasi akan tersimpan persistent di server, sampai anda mengubahnya lagi dengan perintah yang sama.
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 75
3.6.3.6 Menjalankan dan memeriksa thread slave Proses replikasi di slave baru akan berjalan jika ada perintah START SLAVE : 1. Login ke server slave sebagai mysql root 2. Jalankan perintah START SLAVE 3. Periksa status slave Pada kolom Slave_IO_State anda akan mendapati teks 'Waiting for master to send event', artinya thread server sudah aktif dan menunggu update event dari master.
3.6.4 Menguji replikasi dan troubleshooting Adakalanya anda tidak ingin mereplikasi semua database, tapi hanya database tertentu saja. Misalkan anda ingin mereplikasi database saja, tambahkan option berikut di konfigurasi master:
Catatan : perhatikan bahwa jika anda tidak mereplikasi database mysql, ada kemungkinan anda menghadapi masalah ketika aplikasi menggunakan data dari slave (setelah melakukan restore), jika sebelumnya terjadi perubahan grant di master.
3.6.4.1 Menyimpan binary log di direktori tertentu Binary log akan terus bertambah, maka sebaiknya binary log ada di partisi yang berbeda dengan datadir. Gunakan parameter logbin berikut ini di konfigurasi master, untuk memindahkan lokasi binary log ke partisi /blog:
Perhatikan: jika anda memindahkan binary log ke lokasi baru, anda tidak cukup hanya mengedit konfigurasi master, lalu merestart database, cara paling aman adalah: 1. Stop master 2. Edit konfigurasi 76 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
3. Copy (bukan pindahkan) binary log lama ke lokasi baru, termasuk binlog .index 4. Start up master 5. Buat base backup terkini. 6. Setup ulang slave dari base backup yang paling baru. 7. Start up slave 8. Selesai
3.6.4.2 Menyediakan disk space yang cukup besar untuk file temporary di slave Jika slave mereplikasi perintah LOAD DATA INFILE, dan file yang di load di master berukuran besar , maka slave membutuhkan ruang cukup besar untuk menyimpan file ini, untuk sementara, sebelum statemen ini selesai dieksekusi. Parameter yang perlu diset adalah slaveloadtmpdir=/partisi/yang/cukup/besar
3.6.5. Catatan bagi database administrator
3.6.5.1 Memeriksa status master dan slave Administrator perlu memeriksa status master dan slave secara teratur, karena tidak ada jaminan kedua server akan berjalan tanpa masalah sepanjang masa. Jika ada statement dari master yang tidak dapat dieksekusi karena suatu sebab (misal: tidak ada temporary table, grant permission tidak memadai) Perhatikan bahwa replikasi pada MySQL 5.0 memiliki keterbatasanketerbatasan yang mungkin saja dilampaui oleh aplikasi anda. Baca manual mysql Bab 6. bagian 6.7 "Replication Features and Known Problems". Pada bagian akhir tulisan ini (Bagian 9) kami merangkum beberapa keterbatasan yang kami anggap relevan.
3.6.5.2 Ketika mesin server slave restart Jika mesin slave reboot atau restart, administrator harus menjalankan thread slave secara manual, sehingga dapat memastikan apakah thread slave sukses dijalankan.
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 77
3.6.5.3 Memperhatikan disk space untuk binary log Semakin tinggi laju transaksi database, ukuran binary log bertambah dengan cepat, sangat disarankan binary log yang sudah terkirim ke slave dipindahkan ke media backup offline, misal cdrom atau tape backup. Sehingga selalu tersedia ruang yang cukup untuk binary log yang baru.
3.6.5.4 Berhatihati dalam menshutdown server slave Pada saat menshutdown server slave, pastikan bahwa thread eksekusi query slave sudah mengeksekusi semua relay log. Jika anda terpaksa menshutdown ketika ada relay log yang belum dieksekusi, usahakan jangan sampai ada tabel temporer yang terbuka.
3.6.6 Ketika master crash Ketika server master crash, dan tidak dapat segera dipulihkan, inilah saatnya memanfaatkan server slave untuk menggantikannya.
3.6.6.1 Mempromosikan slave menjadi master Berikut ini prosedur untuk mempromosikan slave menjadi master: 1. Shutdown server slave, jalankan:
2. Copy file konfigurasi slave /etc/slave.cnf menjadi /etc/master.cnf 3. Edit file /etc/master.cnf, hapus semua parameter yang berhubungan dengan setting slave, yaitu: readonly skipslavestart serverid=1
4. Jalankan master baru 5. Ubah konfigurasi aplikasi (misalkan aplikasi dikembangkan dari bahasa PHP dan file konfigurasi berada di config.php), arahkan ke master baru ini 6. Selesai
78 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
3.6.6.2 Membuat slave baru Buat slave baru, agar master baru dapat direplikasi. Prosedurnya seperti yang dijelaskan dibagian sebelumnya.
3.6.6.3 Alternatif lain: mebuat master baru Alternatif ini lebih disukai jika yang crash hanya instalasi database master saja dan tidak dapat segera dipulihkan, sedangkan sistem operasi masih berjalan baik. Prosedurnya: 1. Stop thread slave 2. Backup datadir slave 3. Copy arsip datadir slave ke master 4. Gunakan arsip tersebut sebagai datadir master 5. Setup konfigurasi master baru 6. Jalankan master 7. Jalankan thread slave 8. selesai
3.7 Membuat database backup secara periodik 3.7.1 Mengapa perlu backup lagi? Replikasi dapat digunakan sebagai backup, walau demikian ada sedikitnya 2 alasan perlunya melakukan base backup secara periodik:
3.7.1.1 Sebagai backup sekunder Replikasi memiliki keterbatasanketerbatasannya sendiri (lihat bagian 6 di manual MySQL) maka tidaklah bijaksana jika kita hanya mengandalkan replikasi saja. Kita tidak pernah tahu jika keterbatasan tersebut akan kita temui dan apakah kita memiliki pemecahan yang cepat jika itu terjadi.
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 79
3.7.1.2 Memulihkan kesalahan eksekusi update SQL pada master Proses replikasi mengeksekusi setiap pernyataan yang memodifikasi data dari master ke slave, termasuk perintah yang diinput oleh user secara tidak sengaja. Jika user melakukan kesalahan update atau delete yang tidak bisa dipulihkan dengan perintah SQL, maka diperlukan prosedur khusus untuk mengembalikan data ke keadaan sebelum dieksekusinya perintah yang salah tersebut. Prosedur ini akan efektif jika kita memiliki base backup yang mutakhir.
3.7.2 Apa saja dan bagaimana Prosedur base backup sama dengan yang sudah dijelaskan dibagian 3.6.2.6. Hanya saja prosedur tersebut dijalankan secara periodik.
3.7.3 Skrip untuk otomatisasi Berikut ini script yang dapat digunakan untuk mengotomatisasi base backup secara periodik. Perhatikan bahwa anda perlu mengedit pattern 'mysqlbinlog' jika nama binlog yang anda gunakan berbeda. #!/bin/sh # otomatisasi base backup # $Id: 3_0_basebackup.sh,v 1.3 2006/07/26 08:14:47 yanf Exp $ # WARN masih menggunakan nama binlog yg hardcoded: mysqlbinlog # harus diedit jika berbeda dg nama binlog anda # dir edit bila perlu datadir=/mnt/data/mydata destdir=/mnt/download/files prefix=basebkp # auth *sensitive* info # harus user yg dapat lock tables edit bila perlu user=root pass=1 # list dbname yg akan dibackup edit bila perlu dbnames='testdb mysql gsmdev5_proven'
80 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
# lokasi mysql bin edit bila perlu mysqlbin=/usr/local/mysql5/bin dir=`dirname $datadir` name=`basename $datadir` export PATH=$mysqlbin:$PATH lockcmd='FLUSH TABLES WITH READ LOCK' unlockcmd='UNLOCK TABLES' statuscmd='SHOW MASTER STATUS' logincmd="mysql u${user} p${pass}" # flush and lock echo $lockcmd|$logincmd # master status x=`echo $statuscmd|$logincmd` # define nama archive b'dasar nama & posisi binlog # nama binlog binlog=`echo $x| awk '{ if ($0 ~ /mysqlbinlog/) { printf "%s", $5 } }'` # posisi binlog pos=`echo $x| awk '{ if ($0 ~ /mysqlbinlog/) { printf "%d", $6 } }'` archive=${prefix}_${binlog}_${pos}.tar compressed="$destdir/$archive.gz" if [ e $compressed ] then # jangan lupa unlock echo $unlockcmd|$logincmd echo "sudah ada $compressed .. exit" exit 0 fi # archive db cd $datadir tar cvf $destdir/$archive $dbnames # unlock echo $unlockcmd|$logincmd # compress cd $destdir gzip $archive
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 81
Perhatikan bahwa script ini berisi nama user dan password untuk database, sebaiknya set ownership file ini dengan 700.
3.8 Memulihkan dari kesalahan eksekusi update SQL di master Suatu sore seorang programmer PHP yang sudah lebih dari 24 jam tidak tidur, secara tidak sengaja mengeksekusi perintah UPDATE pada tabel transaksi berisi ratusan ribu record tanpa menuliskan klausa WHERE, di server master. Bagian ini menjelaskan cara menyelamatkan diri anda sebagai DBA dan dirinya sebagai programmer, dari kemurkaan users dan atasan tanpa harus mencari pekerjaan baru.
3.8.1 Mengunci master dari user Database master pada saat ini berada dalam kondisi error, jadi perlu mencegah user melakukan modifikasi data. Perintah berikut di mysql, akan mencegah user melakukan update, sekaligus memflush semua perubahan yang sudah terjadi di tabel ke disk:
mysql>FLUSH TABLES WITH READ LOCK
3.8.2 Mencari posisi binlog terakhir Misalkan user tersebut menjalankan perintah: UPDATE transaksi_jual SET status=2
Maka kita perlu mencari perintah tersebut dimulai dari binlog yang sedang aktif, misal mysqlbinlog.000006, gunakan utilitas mysqlbinlog sbb: # mysqlbinlog mysqlbinlog.000006
Maka akan muncul barisbaris sebagai berikut: # at 232 #060725 18:15:44 server id 1 end_log_pos 260 Intvar SET INSERT_ID=202; # at 260
82 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
#060725 18:15:44 server id 1 end_log_pos 366 Query thread_id=7 exec_time=0 error_code=0 SET TIMESTAMP=1153826144; INSERT INTO t1 values (default,'zzzz...'); # at 394 #060725 18:15:44 server id 1 end_log_pos 500 Query thread_id=8 exec_time=0 error_code=0 SET TIMESTAMP=1153826144; UPDATE transaksi_jual SET status=2;
Dari file tersebut dapat kita ketahui posisi log (end_log_pos), tepat sebelum perintah UPDATE tersebut adalah 366.
3.8.3 Menggunakan base backup terakhir Jika thread slave sedang berjalan, kemungkinan besar slave yang ada sekarang berada pada kondisi yang sama dengan master, yaitu mengalami kesalahan update. Jadi perlu mensetup slave baru, dengan kondisi data seperti masa lampau, sebelum terjadinya kesalahan update. Sekarang saatnya memanfaatkan base backup yang dibuat sebelum dijalankannya perintah UPDATE tersebut. Setup slave baru dengan datadir dari base backup tersebut, seperti dijelaskan dibagian sebelumnya.
3.8.4 Menjalankan thread slave sampai posisi tertentu Sekarang kita perlu menjalankan thread slave, dengan menambahkan posisi terakhir sebelum thread slave tersebut berhenti, jalankan: mysql>START SLAVE UNTIL master_log_file='mysqlbinlog.000006',master_log_pos=366
3.8.5 Mengganti data master Selanjutnya anda bisa memperlakukan situasi ini seperti bagian 3.6.6 Ketika Master crash. Data dari slave yang sudah disinkronkan sampai posisi tertentu (366 pada contoh ini) digunakan sebagai data master.
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 83
3.8.6 Menjalankan thread slave seperti biasa Setelah master beroperasi normal, jalankan thread slave seperti biasa: 1. Stop thread slave: mysql>STOP SLAVE;
2. Start thread slave: mysql>START SLAVE;
3.9 Keterbatasanketerbatasan Replikasi Replikasi sekalipun bermanfaat dan berdaya guna, tetapi juga memiliki keterbatasan. Sebagian besar keterbatasan ini adalah inherent, dikarenakan replikasi mysql menggunakan querylevel logging, yaitu master menuliskan query yang berhasil dieksekusi ke binary log, untuk selanjutnya dieksekusi oleh slave. Berikut ini keterbatasanketerbatasan yang kami anggap perlu diketahui, yang diambil dari Manual MySQL 5.0, bab 6, bagian 6.7. "Replication Features and Known Problems". 1. Menambahkan kolom yang AUTO_INCREMENT ke sebuah tabel dengan perintah ALTER TABLE mungkin saja menghasilkan urutan baris yang tidak sama antara master dan slave, karena urutan bergantung pada storage engine yang digunakan dan urutan baris yang diinsert. 2. Fungsi USER(), UUID(), and LOAD_FILE() direplikasikan tanpa perubahan, sehingga tidak dapat diandalkan di slave. 3. User privilege hanya direplikasikan jika database mysql juga direplikasikan. Artinya, pernyataan GRANT, REVOKE, SET PASSWORD, CREATE USER, and DROP USER, hanya berpengaruh di slave, jika replikasi menyertakan database mysql. 4. Perbedaan data master dan slave sangat mungkin terjadi, jika pernyataan (sql) yang digunakan menghasilkan modifikasi data yang nondeterministic, sehingga hasilnya bergantung pada query optimizer. 84 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
Contoh: (a) Pernyataan CREATE ... SELECT atau INSERT ... SELECT yang menginsert nilai nol atau NULL ke sebuah kolom AUTO_INCREMENT. (b) Pernyataan DELETE jika digunakan menghapus baris pada sebuah table yang memiliki foreign key dengan properti ON DELETE CASCADE. (c) Pernyataan REPLACE ... SELECT, INSERT IGNORE ... SELECT jika ada duplikasi nilainilai pada data yang diinsert. 5. Walaupun table temporer direplikasikan, jika terjadi shutdown pada server slave (bukan hanya thread slave), dan tabel temporer sudah tereplikasi, tapi pernyataan update yang menggunakan replikasi tersebut belum sempat dieksekusi di slave. Maka, ketika slave direstart, tabel temporer sudah tidak ada lagi (karena 'temporer') sehingga perintah update yang menggunakan tabel temporer tersebut dipastikan akan gagal dan menghentikan thread eksekusi SQL di slave. Untuk mencegah hal ini, hindari menshutdown slave ketika tabel temporer masih open. Berikut ini prosedurnya: a) Jalankan perintah STOP SLAVE b) Gunakan SHOW STATUS untuk memeriksa nilai variabel Slave_open_temp_tables. c) Jika nilainya 0, berarti tidak ada tabel temporer yang terbuka, jalankan perintah mysqladmin shutdown untuk menshutdown server slave. d) Jika nilainya tidak 0, berarti ada tabel temporer yang terbuka, jalankan perintah START SLAVE. e) Ulangi prosedur ini sampai variabel Slave_open_temp_tables sama dengan 0, baru anda boleh menshutdown slave server. 6. Jika terjadi crash pada master, mungkin sekali terjadi posisi akhir binary log di master berada dibawah posisi terbaca oleh slave, karena binary log di master belum sempat di flush. Hal ini dapat menyebabkan slave tidak dapat mereplikasi, ketika master kembali beroperasi. Untuk mencegahnya gunakan setting syncbinlog=1, sehingga master sesering mungkin memflush ke binary log. 7. Jika sebuah pernyataan di slave menghasilkan error maka thread SQL slave berhenti, dan Panduan Pendayagunaan Open Source Software: RDBMSMySQL 85
slave akan menuliskan pesan error ke error log. Anda harus login ke slave secara manual dan memeriksa status slave (SHOW SLAVE STATUS). Lalu membereskan masalahnya, baru menjalankan thread slave dengan START SLAVE. 8. Nilainilai floating point adalah pendekatan (aproksimasi), sehingga perbandingan perbandingan yang menggunakan nilainilai ini tidak pasti juga, hal ini berlaku pada operasi yang secara eksplisit menggunakan floating point atau secara implisit menggunakan nilainilai yang dikonversi ke floating point. Perbandingan nilainilai floating point mungkin saja menghasilkan perbedaan antara master dan slave, yang disebabkan perbedaan arsitektur mesin komputer, compiler yang digunakan untuk mem build MySQL dan sebagainya.
3.10 Penutup Jika data anda hilang, apapun database anda, anda tidak dapat menuntut manufaktur software database untuk mengembalikan data tersebut bahkan software komersial bernilai ribuan dollar sekalipun. Silakan periksa di License Agreement. Apapun database anda, pastikan tersedia prosedur backup dan recovery yang dapat diandalkan. Replikasi adalah salah satu cara membackup data yang dapat diandalkan. MySQL memiliki sistem replikasi yang cukup andal dan mudah digunakan, jika kita dapat mengenali keterbatasanketerbatasannya. Tidaklah bijaksana jika hanya mengandalkan replikasi semata untuk menyediakan backup, kita perlu menyediakan backup sekunder sebagai antisipasi jika data replikasi tidak dapat digunakan pada proses pemulihan. Sebaiknya anda tidak mempelajari replikasi hanya dari tulisan ini saja, penting sekali mendalami dari sumber aslinya yaitu Reference Manual MySQL 5.0, bab 6, sebelum akhirnya memutuskan untuk menggunakan replikasi di server produksi anda.
86 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
IV. Perbandingan DBMS Oracle, MySQL, dan PostgreSQL
4.1 Fiturfitur dasar 4.1.1 Kesesuaian dengan standard SQL : DBMS
Deskripsi
MySQL
Entrylevel SQL'92
Oracle
Kesesuaian dengan SQL '89, subset dari jenis SQL '92 plus tipetipe yang khusus Beberapa jenis SQL '92 dipetakan ke tipe Oracle. tidak ada jenis boolean atau persamaan
PostgreSQL
Subset lanjutan dari SQL '92/99' dan bahasa SQL 3. Jenis data dan syntax SQL ’92 dipetakan langsung ke PostgreSQL menjadi bahasa aslinya
4.1.2 Biner dan karakter objek besar DBMS
Biner
Karakter
MySQL
TINYBLOB, BLOB,MEDIUMBLOB dan LONGBLOB, berbeda hanya pada panjang maximum, tipetipe tsb bisa mencapai 2^32(4GB) byte
TINYTEXT,TEXT,MEDI UMTEXT dan LONGTEXT dapat disamakan dengan empat tipe data BLOB dan memiliki ukuran panjang maximum dan kebutuhan penyimpanan yang sama
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 87
DBMS
Biner
Karakter
Oracle
LONG RAW(2 GB),BLOB(4 GB) dan BFILE(penyimpanan external, mencapai 4 GB)
LONG (2 GB) dan CLOB (4 GB)
PostgreSQL
Harus didefinisikan oleh user di CREATE TYPE, ukuran terbatas oleh maximum ukuran baris. BLOBs disimpan diluar table, hanya OID dari BLOB yang disimpan di table
Ukuran Tipe TEXT terbatas oleh maximum ukuran baris
4.1.3 Tipe data Userdefined
DBMS
Deskripsi
MySQL
Tidak Ada
Oracle
User bisa membuat tipe data baru yang kompleks
PostgreSQL
User bisa menambah tipe data baru menggunakan perintah CREATE TYPE
4.1.4 Perluasan objectrelational DBMS
Deskripsi
MySQL
Tidak Ada
Oracle
Ya
PostgreSQL
Struktur table bisa diwariskan
88 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
4.1.5 Tipe data khusus (multimedia,dll) DBMS
Deskripsi
MySQL
Tidak Ada
Oracle
Ya
PostgreSQL
Tipe geometris yang mewakili objek 2 dimensi.
4.1.6 Perintah subquery DBMS
Deskripsi
MySQL
Ya, dimulai dari versi 4.1
Oracle
Subquery yang terhubung dan tak terhubung mencapai 255 level
PostgreSQL
SQL kurang lebih sama dengan Oracle.
4.1.7 Primary dan Unique key DBMS
Deskripsi
MySQL
Ya
Oracle
Ya
PostgreSQL
Ya.
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 89
4.1.8 Foreign Key DBMS
Deskripsi
MySQL
Ya, pada tipe InnoDB, penghapusan relasi atau multitable dapat dilakukan. Pada tipe MyISAM, FOREIGN KEY hanya sebagai kecocokan, dan tidak berpengaruh terhadap pengoperasian database
Oracle
Ya, mendukung CASCADE
ON DELETE
PostgreSQL
Ya, mendukung ON DELETE CASCADE dan ON UPDATE CASCADE
4.1.9 Check DBMS
Deskripsi
MySQL
Ya, pada versi 5 atau diatasanya
Oracle
Ya
PostgreSQL
Ya
4.1.10 Views DBMS
Deskripsi
MySQL
Ya, pada versi 5 atau diatasanya
Oracle
Ya
PostgreSQL
Ya
90 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
4.1.11 Updatable Views DBMS
Deskripsi
MySQL
Ya, pada versi 5.0.1
Oracle
Ya
PostgreSQL
Ya
4.1.12 Synonims(Alias pada table, view atau objek lain di database) DBMS
Deskripsi
MySQL
Tidak
Oracle
Ya
PostgreSQL
Tidak
4.1.13 Auto Increment (penambahan otomatis) kolom DBMS
Deskripsi
MySQL
Ya, hanya boleh satu kolom sebagai auto increment pada satu table dan harus diindex
Oracle
Tidak
PostgreSQL
Ya, tipe data SERIAL
4.1.14 Konversi otomatis code pages (antara klien dan server) Konversi otomatis code pages artinya bahwa jika page codes di server dan di klien berbeda, konversi harus dituntaskan.
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 91
DBMS
Deskripsi
MySQL
Tidak
Oracle
Ya
PostgreSQL
Tidak
4.2 Transaksi 4.2.1 Mendukung proses transaksi DBMS
Deskripsi
MySQL
Ya, pada tipe InnoDB
Oracle
Ya
PostgreSQL
Ya
4.2.2 Transaksi Rollback Sebagian DBMS
Deskripsi
MySQL
Mulai versi 4.0.14, InnoDB mendukung SAVEPOINT dan ROLLBACK TO SAVEPOINT
Oracle
Rollback ke savepoint, juga dimungkinkan mulai baru lagi, transaksi tersendiri dari transaksi yang sedang berjalan
PostgreSQL
Mulai dari 6.0.1 mendukung ROLLBACK, ROLLBACK TO SAVEPOINT
92 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
4.2.3 Level Penguncian (table, page dan baris) DBMS
Deskripsi
MySQL
Penguncian table pada tipe ISAM/MyISAM dan HEAP, penguncian page pada tipe BDB. Tipe InnoDB mendukung penguncian pada baris
Oracle
Pada level baris dan table
PostgreSQL
Pada level baris dan table
4.2.4 Deteksi Deadlock dan pemecahannya DBMS
Deskripsi
MySQL
Ya
Oracle
Ya
PostgreSQL
Ya
4.3 DB programming 4.3.1 Bahasa untuk menulis stored procedure DBMS
Deskripsi
MySQL
Ya, pada versi 5, sebelumnya UDF (ditulis dalam bahasa C atau C++) digunakan untuk mengembangkan MySQL dengan fungsifungsi baru yang bekerja seperti fungsi asli MySQL
Oracle
PL/SQL dan Java
PostgreSQL
PL/PGSQL, PL/TCL,PL/Perl,SQL,C. dimungkinkan untuk membuat bahasa baru CREATE LANGUAGE
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 93
4.3.2 Triggers DBMS
Deskripsi
MySQL
Dukungan belum begitu sempurna, tersedia pada versi 5.0.2
Oracle
Pada PL/SQL. Trigger bereaksi pada kejadian : BEFORE/AFTER DELETE/UPDATE/INSERT INSTEAD OF Trigger dapat juga digunakan saat meng update view
PostgreSQL
Aturan deklarasi suatu ekstensi ke SQL. User bisa membuat SELECT,INSERT,DELETE atau UPDATE sebagai event(kejadian) nya. Aturan INSTEAD OF dapat digunakan untuk mengupdate data melalui views. Trigger prosedur di PL/PGSQL,PL/TCL,PL/Perl dan C. CREATE CONSTRAIN TRIGGER membuat trigger untuk mendukung constrain. User bisa menentukan BEFORE atau AFTER pada INSERT,DELETE atau UPDATE sebagai event triggernya.
94 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
4.4 Administrasi 4.4.1 Otorisasi User DBMS
Deskripsi
MySQL
User didefinisikan saat pertama kali login, beserta password dan hostname nya. Otorisasi dibuat pada sisi server, dan dimungkinkan juga untuk koneksi yang aman antara klient dan user menggunakan SSL
Oracle
User didefinisikan pada saat login beserta password, juga dimungkinkan menggunakan otorisasi level system operasi
PostgreSQL
Berikut opsi pengesahan yang tersedia di PostgreSQL per database :
Trust authentication
Password authentication
Kerberos authentication
Identbased authentication
PAM Pluggable Authentication Modules berdasarkan metode authentication
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 95
4.4.2 Enkripsi koneksi klientserver DBMS
Deskripsi
MySQL
SSL 4.0
Oracle
Tidak diketahui
PostgreSQL
SSL atau SSH. Kerberos authentication
4.4.3 Izin pengaksesan objek (level) DBMS
Deskripsi
MySQL
Level table. Hak INSERT dan UPDATE bisa dibatasi sampai kolom
Oracle
Level table. Hak UPDATE,INSERT, dan REFERENCES pada kolom yang dipilih
PostgreSQL
Level table
4.4.4 Izin grouping DBMS
Deskripsi
MySQL
Tidak
Oracle
Hak bisa di group ke roles. Roles bisa memberi izin ke user role lainnya
PostgreSQL
Bisa membuat grupgrup user dan izin bisa diberikan ke grup tersebut
96 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
4.4.5 Incremental dan backup online DBMS
Deskripsi
MySQL
InnoDB backup online, juga mendukung backup incremental
Oracle
Ya
PostgreSQL
Mungkin akan segera ditambahkan, diharapkan setelah versi 7.5
4.4.6 Tools untuk eksport data DBMS
Deskripsi
MySQL
Ya, seperti mysqldump, mysqlhotcopy, mysqlsnapshot, innodb2myisam
Oracle
Hanya sekumpulan dari hasil query SQL
PostgreSQL
Ya, pgdump, pg_dumpall
4.4.7 Tools untuk mengimport data DBMS
Deskripsi
MySQL
Mengimport dari file text,HTML, DBF
Oracle
Kecepatan tinggi dan load data sangat flexible
PostgreSQL
COPY memindahkan data antara PostgreSQL dan standard filesystem COPY menginstruksikan backend PostgreSQL backend membaca langsung, atau menulis ke file
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 97
4.5 Portability dan Scalability 4.5.1 Hardware dan system platform yang mendukung DBMS
Deskripsi
MySQL
Banyak platform UNIX, windows dan OS/2. Di paket dan tersedia bersama hampir semua distro Linux
Oracle
Lebih dari 200 platform, termasuk UNIX,Windows, platform midrange dan mainframe
PostgreSQL
Banyak platform UNIX, windows. QNX real time system untuk x86
4.5.2 Portability data dan kode (procedure penyimpanan) DBMS
Deskripsi
MySQL
Penyalinan dari file MySQL (.FRM,.MYI,.MYD) antar platform dengan perbedaan arsitektur, tapi memiliki persamaan format floatingpoint. Data dan index pada tipe ISAM tidak terpengaruh dengan arsitektur dari H/W dan beberapa system lainnya, seperti pada program ‘mysqldump’
Oracle
Data dan kode bisa di pindah antar platform tanpa mengubah apapun dengan menggunakan utility export/import
PostgreSQL
Ya
98 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
4.5.3 Mendukung system SMP (eksekusi query parallel) Proses parallel dalam sistem single memory, dikenal juga dengan Symmetric Multi Processing (SMP) hardware, yang dalam multi prosesor menggunakan satu sumber daya memory DBMS
Deskripsi
MySQL
Sebuah server multithread yang bisa menggunakan banyak prosesor. Thread terpisah dibuat untuk tiaptiap koneksi
Oracle
Oracle bisa menggunakan system multiprocessor (SMP) misalkan untuk parallel query
PostgreSQL
Tidak memiliki thread, tapi tiap koneksi memiliki prosesnya sendirisendiri
4.6 Performa dan VLDB 4.6.1 Implementasi VLDB yang diketahui Very Large Database (VLDB) artinya multiple gigabytes atau single terabyte
DBMS
Deskripsi
MySQL
Menangani database yang besar
Oracle
Terabyte database exist
PostgreSQL
60 GB databases exist
4.6.2 Maximum jumlah baris dan kolom DBMS
Deskripsi
MySQL
Maksimum jumlah kolom dalam satu table 3398; jumlah baris 65534 (BLOB dan TEXT tidak termasuk)
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 99
DBMS
Deskripsi
Oracle
Maksimum jumlah kolom dalam satu table 1000; bisa mencapai 32 kolom di index key
PostgreSQL
Tak terbatas, kolom 1600; jumlah baris 1.6 TB
4.6.3 Maximum jumlah table dan index DBMS
Deskripsi
MySQL
Table tak terbatas, bisa mencapai 32 index per table dengan maximum 256 bytes panjang key
Oracle
Tak terbatas
PostgreSQL
Tak terbatas
4.6.4 Tuning ‘manual’ alokasi DBMS
Deskripsi
MySQL
Beberapa parameter yang eksist pada tipe InnoDB sebagai table space, lokasi file data, penambahan/perluasan otomatis,dsb
Oracle
Ya, banyak parameter dari alokasi yang bisa di tuned pada system, ruang tgable atau level object
PostgreSQL
Lokasi file data dan ruang table diimplementasikan di versi 8
100 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
4.6.5 Partisi otomatis pada table/index besar dan menggunakan partisi dalam pengoptimalan query Table/index yang sangat besar dan mengizinkan user untuk menguraikannya ke bagian bagian kecil agar lebih mudah diatur disebut ‘partisi’. DBMS
Deskripsi
MySQL
Ya, pada InnoDB
Oracle
Ya
PostgreSQL
Table dan index secara otomatis di partisi, tapi tidak ada peningkatan spesifik pada pengoptimalan query
4.6.6 Akses ke multiple database dalam satu sessi DBMS
Deskripsi
MySQL
Hanya berpindah antar database yang mungkin. pada SELECT, data dari database yang berbeda bisa diambil
Oracle
Tiap sessi bisa mengambil data dari tiap kejadian
PostgreSQL
Hanya berpindah antar database yang mungkin.
4.6.7 Replikasi Replikasi adalah proses mengcopy dan memelihara objek database dalam multiple database yang membuat system distribusi database. Replikasi bisa meningkatkan performa, dan melindungi ketersediaan aplikasi karena adanya data alternative.
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 101
DBMS
Deskripsi
MySQL
Ya,stabil mulai versi 3.23.32
Oracle
Umumnya, 3 Oracle menyediakan area replikasi
PostgreSQL
Beberapa system replikasi tersedia, baik versi komersial atau non komersial.
4.6.8 Gerbang(Gateway) ke DBMS lain DBMS
Deskripsi
MySQL
Tidak
Oracle
Ya, gerbang ke DBMs lain tersedia
PostgreSQL
Tidak
4.7 Interfaces dan Pengembangan Aplikasi 4.7.1 Interface standar ODBC dan JDBC DBMS
Deskripsi
MySQL
Driver ODBC (myODBC) dan 2 tipe dari JDBC tersedia
102 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
DBMS
Deskripsi
Oracle
JDBC Thin Driver untuk aplikasi klient (applet) di tiga lapis arsitektur :
PostgreSQL
Driver JDBC OCI Clientside untuk aplikasi client server JDBC server driver untuk membuat aplikasi yang bekerja pada sisi server (servlet)
Tersedia 4 driver JDBC. Mengindikasikan driver ditulis dalam bahasa Java, sekali dikompile, driver bisa berjalan di platform mana saja, karena komunikasi database memiliki protocol networknya sendiri
4.7.2 Support aplikasi DBMS
Deskripsi
MySQL
C/C++, Java,Perl,Python,PHP, Ruby
Oracle
Oracle OCI low level access to DBMS; Perl, Python
PostgreSQL
C/C++, Java,Perl,Python,PHP, Ruby,TCK/TK,Object Pascal dan Pl/pgSQL sebanding dengan PL/SQL nya Oracle
4.7.3 Dedicated Server Web DBMS
Deskripsi
MySQL
Tidak
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 103
DBMS
Deskripsi
Oracle
Beberapa produk web : Oracle WebDB untuk aplikasi web sederhana Oracle Application Server (OAS) untuk professional Oracle Internet Server versi khusus server http Apache
PostgreSQL
Tidak
4.7.4 Support XML terintegrasi dengan DBMS DBMS
Deskripsi
MySQL
Tidak
Oracle
Banyak tools XML terintegrasi dengan DBMS(parser,processor,XSLT,dll)
PostgreSQL
Menyediakan opsi XML yang menangani distribusi paket dengan server inti
4.7.5 Mendukung paket CASE DBMS
Deskripsi
MySQL
PLONE, Ruby on Rails
Oracle
Oracle Designer,JDeveloper
PostgreSQL
Tak diketahui
104 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
4.8 Kehandalan 4.8.1 Otomatis recovery dari kegagalan DBMS
Deskripsi
MySQL
Hanya tipe InnoDB, tool Hot backup juga tersedia di InnoDB untuk membuat backup pada database yang running di background, tanpa perlu men set penguncian atau mengganggu operasi database
Oracle
Recovery dari kegagalan lunak otomatis dan transparan. Recovery dari kegagalan media memerlukan copy backup. Dengan log Redo, dimungkinkan untuk merecover semua transaksi yang di commit atau recover waktu yang lebih spesifik
PostgreSQL
WAL (Write Ahead Logging)
4.9 Isuisu komersial 4.9.1 Tipe lisensi DBMS
Deskripsi
MySQL
GPL (GNU General Public License) atau komersial
Oracle
Negosiasi dengan Oracle atau basis site bysite
PostgreSQL
BSD (Barkeley Software Distribution) open source
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 105
4.9.2 Tehnical Support DBMS
Deskripsi
MySQL
Millist dan website, Membayar jasa tehnical support juga bisa melalui telephone
Oracle
Jasa tehnikal support berkualitas tinggi tersedia dalam beberapa tingkatan
PostgreSQL
Millist dan website, dukungan secara komesial kini mulai tersedia yang terdiri dari beberapa perusahaan khusus PostgreSQL, juga tersedia di beberapa daerah lain dari perusahaan besar seperti Fujitsu,SRA dan Pervasive
4.9.3 Pembagian pasar Berdasarkan majalah SD Times juli 2004, poling top deployed database menunjukkan database yang popular penggunaannya : ●
SQL Server : 78%
●
Oracle : 55%
●
MySQL:33%
●
PostgreSQL: 8%
106 Panduan Pendayagunaan Open Source Software: RDBMSMySQL
4.9.4 Segmen pasar secara spesifik DBMS
Deskripsi
MySQL
Web server, yang umum menggunakan system berbasis linux
Oracle
Tidak spesifik
PostgreSQL
Pendidikan,Perusahaan Telephon,Pelayanan DNS dan web
Panduan Pendayagunaan Open Source Software: RDBMSMySQL 107