Loopback Yang Hilang Dan Pengaruhnya

Friday, July 11th, 2008

Akhirnya saya memutuskan untuk menggunakan Ubuntu 8.04 di PC kantor yang selama ini menggunakan Ubuntu 6.10 yang sudah hampir 2 tahun berjalan di PC tersebut, dan faktor ini juga yang mendukung saya untuk upgrade ke Ubuntu 8.04

Setelah beberapa hari menggunakan Ubuntu 8.04 ada masalah yang timbul, yaitu pada saat setelah login, gnome lama sekali loadingnya. Dan kalaupun berhasil maka akan menampilkan pesan kesalahan seperti ini.

Bukan cuma itu saja, theme ubuntu yang warna coklat itu juga berubah menjadi warna biru. Jika dilihat dari pesan kesalahannya, saya menduga bahwa ini masalah di konfigurasi loopback. Jadi darimana tahu kalau masalahnya di loopback?

Setelah membiarkan masalah ini berlarut - larut selama beberapa hari (walaupun jengkel juga harus menunggu lama pada saat loading desktop setelah login) sampailah saya diharuskan menggunakan MySQL Server di PC tersebut. Dan disinilah misteri ini mulai terungkap. Karena MySQL Server tidak dijalankan pada saat boot, maka saya jalankan secara manual.

dolly@pc:~$ sudo /etc/init.d/mysql start
 
* Starting MySQL database server mysqld           [fail]

Kemudian saya cek errornya, untuk mengetahui kenapa tidak MySQL Server tidak mau jalan.

dolly@pc:~$ sudo tail /var/log/syslog  /etc/init.d/mysql[8394]: 0 processes alive and '
 
/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf ping' resulted in
 
/usr/bin/mysqladmin: connect to server at 'localhost' failed
 
/etc/init.d/mysql[8394]: error: 'Can't connect to local MySQL server through socket '
 
/var/run/mysqld/mysqld.sock' (2)'
 
/etc/init.d/mysql[8394]: Check that mysqld is running and that the socket: '
/var/run/mysqld/mysqld.sock' exists! 

Menurut google, masalah error seperti ini biasa terjadi jika parameter bind-address di konfigurasi MySQL tidak di set ke localhost. Kemudian saya cek konfigurasi MySQL dan bind-address sudah di set ke localhost. Loh jadi masalahnya dimana?

Saya coba untuk menenangkan diri sejenak :D . Kemudian saya coba ping ke localhost, dan hasilnya tidak ada respon. Lalu saya periksa dokumen /etc/network/interfaces untuk melihat konfigurasi network di PC tersebut, dan mendapatkan temuan bahwa tidak adanya loopback untuk PC tersebut. Untuk mengaktifkan loopback, saya tambahkan baris berikut pada dokumen /etc/network/interfaces

auto lo iface lo inet loopback

Setelah itu restart network

dolly@pc:~$ sudo /etc/init.d/networking restart

Saya coba ping ke localhost, dan hasilnya reply. Kemudian saya jalankan MySQL Servernya.

dolly@pc:~$ sudo /etc/init.d/mysql start
 
* Starting MySQL database server mysqld [ OK ]
* Checking for corrupt, not cleanly closed and upgrade needing tables.

MySQL Server sudah jalan, dan siap digunakan :) Keesokan harinya pada saat menghidupkan PC, pesan kesalahan dari gnome yang seperti biasanya muncul sudah tidak ada lagi. Dan theme ubuntu juga sudah kembali seperti semula. Dari sini saya langsung menganalisa bahwa kesalahannya ada di loopback, karena konfigurasi yang saya update terakhir kali adalah loopback ini. Untuk membuktikannya saya hapus lagi konfigurasi loopback yang ada di dokumen /etc/network/interfaces kemudian logout dan login kembali. Dan ternyata pesan kesalahan dari gnome itu muncul lagi. Jadi bisa dipastikan 68% penyebab dari masalah ini adalah konfigurasi loopback :D

Mungkin ini yang disebut pepatah Sekali mendayung 13 pulau terlewati :D

Akun debian-sys-maint pada MySQL di Debian

Tuesday, April 1st, 2008

Kemarin ada teman yang mempunyai masalah pada MySQL Server di mesin Ubuntu miliknya. Setiap MySQL Server dijalankan selalu memberikan pesan kesalahan ERROR 1045 (28000): Access Denied For user ‘debian-sys-maint’@'localhost’. Pesan kesalahan ini didapat setelah mengimpor semua data dari MySQL Server yang ada di Windows termasuk database MySQL. Pesan ini menunjukkan bahwa akun debian-sys-maint mencoba menggunakan MySQL tetapi gagal dalam melakukan autentikasi.

Ada perlu apa debian-system-maint menggunakan MySQL?

Akun debian-sys-maint digunakan oleh sistem operasi Debian dan anak cucunya untuk melakukan maintenance terhadap MySQL. Yang mana setiap menjalankan MySQL Server maka sistem akan melakukan pengecekan apakah ada database ataupun tabel yang crash apa tidak. Jika ada yang crash maka mysql akan menampilkan proses apa saja yang ada pada MySQL dan juga statusnya. Pengecekan ini diatur pada file /etc/mysql/debian-start yang memanfaatkan tools dari mysql, yaitu mysqlcheck dan mysqladmin.

Kenapa bisa mendapat pesan kesalahan seperti ini?

Seperti sebelumnya yang saya katakan, pesan ini didapat karena akun debian-sys-maint gagal melakukan autentikasi. Hal ini disebabkan beberapa hal, yaitu:

  • Tidak adanya akun debian-sys-maint di MySQL disebabkan oleh impor data yang dilakukan. Karena pada data yang sebelumnya (MySQL versi Windows ataupun Sistem Operasi lain) tidak memiliki akun debian-sys-main.
  • Tidak cocoknya password debian-sys-maint pada file konfigurasi dengan password MySQL
    Konfigurasi dari akun debian-sys-maint sendiri bisa dilihat pada file /etc/mysql/debian.cnf

Bagaimana cara mengatasinya?

Untuk mengatasi masalah ini cukup dengan menset ulang password akun debian-sys-maint diganti dengan password yang ada pada file konfigurasi. Jika akun debian-sys-maint ternyata tidak ada di MySQL maka kita harus membuatnya terlebih dahulu. Untuk melakukannya cukup dengan cara berikut:

$ mysql -u root -p

mysql> GRANT ALL PRIVILEGES ON *.* TO ‘debian-sys-maint’@'localhost’ IDENTIFIED BY ‘password yg ada di file konfigurasi’ WITH GRANT OPTION;

mysql> \q

$ sudo /etc/init.d/mysql restart

Keterangan:

  • Pertama - tama kita masuk ke MySQL dengan menggunakan akun root.
  • Setelah masuk maka kita menjalankan perintah GRANT ALL … untuk menambahkan akun ataupun menset ulang password debian-sys-maint.
  • Keluar dari mysql
  • Restart MySQL Server untuk melihat apakah masih ada pesan kesalahan seperti sebelumnya.

Lasix
Instant approval credit cards applications
Client dns openVPN
Buy Diclofenac
Credit card application
Sleepwell
Buying life insurance
Credit card reward offers
Credit reports com
Canada credit card online application
Low fixed interest apr credit cards balance transfers
Order credit reports
Online Viagra Cialis
Tramadol Online
Cozaar
Home insurance uk
Credit score interest rate
Phentermine Online
Secured credit card applications
Free credit report service
VPN download
Popular press article on college credit card debt
Cheap Cipro
Free credit report online no membership
Credit report and scores
Credit score of
Zovirax
Affect credit score
Get credit score
Ansaid
Credit report bureau
Burial insuranceCreditcard debt elimination
Cheap Lisinopril
Voltaren
Avapro
Best credit score
Tylenol
Health care insurance
Credit card debt consolidation
Credit card application bad
Online capital one 0 interest credit card application
Loans credit score
Levitra
Credit rating report
Correcting credit reports
Buy Viagra
Card credit debt option reduction
Cheap Protonix
Boost your credit score
Torn up credit card application
No credit card application
Allegra
Buy Flomax
Xenical
Credit scores online
Purchase auto insurance online
Plendil
Cheap Capoten
Application bad card credit credit unsecured
Coreg
Free Sprint Ringtones
To increase credit score
Cephalexin
Free online credit report no trial offer
Credit score loan
Card credit debt grant help pay
Credit card applications with
Instant free credit report
Chase manhattan credit card application
Free credit report. Com
Credit report gov
Online Nexium
Propecia
Homeowners insurance quotes
Increasing credit scores
Levaquin

Manipulasi Data Menggunakan Tabel Pada Database Lain di MySQL

Thursday, February 14th, 2008

MySQL mengizinkan kita untuk memanipulasi data menggunakan data dari database lain. Dengan catatan user kita memiliki akses ke database tersebut. Hal ini bisa dilakukan dengan menyertakan nama database di depan nama tabel. Berikut dua contoh untuk perintah SQL memanipulasi data dari database lain.

CREATE TABLE SELECT

CREATE TABLE  `tost`.`test` SELECT * FROM `test`.`test`
Hasil dari perintah SQL diatas akan membuat table test di database tost yang tabelnya itu (bentuk dan juga isinya) diduplikasi dari tabel test di datbase test.

UPDATE TABLE

UPDATE `tost`.`test`, `test`.`test`
SET `tost`.`test`.`text` = `test`.`test`.`text`
WHERE `tost`.`test`.`id` = `test`.`test`.`id`
Hasil dari perintah SQL diatas akan mengupdate isi field text di table test pada database tost agar sama dengan isi field text di table test pada database test.

Saya rasa kedua contoh perintah SQL diatas sudah cukup, dan mudah - mudahan postingan ini bisa menjawab pertanyaan berikut.

Tidak Bisa Mengakses MySQL Server di Ubuntu

Wednesday, January 30th, 2008

Kemarin ada teman yang tanya kepada saya, kenapa dia tidak bisa mengakses MySQL Server di mesin Ubuntu dari komputer lain. Dan kasus ini cuma terjadi pada mesin Ubuntu saja, karena dia sudah mencoba mengakses MySQL Server ke mesin Fedora dan ternyata bisa. Biasanya ada beberapa point yang bisa menyebabkan hal ini, diantaranya:

  • Belum ditambahkan host “%” untuk user tersebut, pada tabel user di database mysql.
  • Adanya firewall pada network yang memblok port MySQL (default 3306)

Dari kedua point diatas, tidak ada satu pun yang menjadi jawaban atas permasalahan teman saya tersebut. Untuk point pertama, dia sudah menambahkan host “%” untuk user tersebut sebelumnya. Dan untuk point kedua, dia bisa mengakses MySQL Server di mesin Fedora, berarti tidak ada firewall yang memblok port MySQL.

Kemudian saya mencoba mencari di google, dan menemukan jawaban yang sebenarnya. Untuk sistem operasi Debian dan turunannya secara default parameter bind-address di set ke 127.0.0.1 pada file my.cnf yang menyebabkan MySQL Server tidak bisa diakses dari komputer lain. Hal ini dibuat untuk alasan keamanan.

bind-address = 127.0.0.1

Memang tidak baik memberikan akses ke database server dari komputer lain, tetapi ada kalanya kita membutuhkan hal tersebut. Agar MySQL Server bisa diakses dari komputer lain, ubah nilai dari parameter bind-address menjadi alamat network yang dizinkan untuk mengakses MySQL Server tersebut. Bisa juga dengan menghapus paramater tersebut atau menjadikannya komentar.

#bind-address = 127.0.0.1 

Konversi Dokumen DBF ke MySQL

Saturday, December 29th, 2007

Di penghujung tahun biasanya orang - orang pada sibuk membuat resolusi untuk tahun berikutnya. Tapi berbeda dengan saya, di penghujung tahun ini malah posting hal - hal seperti ini. Sebenarnya saya sudah membuat beberapa point untuk resolusi 2008, tapi masih Beta, jadi belum bisa dirilis :)

Di penghujung tahun ini, saya dapat tugas untuk mengkonversi sebuah aplikasi yang dibuat dengan Foxpro menjadi aplikasi berbasis web. Karena saya kurang familiar dengan foxpro, jadi saya mencari tool yang bisa mengkonversi dari Foxpro menjadi MySQL. Akhirnya saya menemukan tool yang bisa memenuhi kebutuhan saya, yaitu dbf2mysql.

Tool ini mempunyai banyak opsi dalam penggunaannya, tetapi saya akan bahas sedikit (yang saya gunakan) saja. Berikut adalah salah satu contoh penggunaan dbf2mysql :

dbf2mysql [-h host database server] [-U user database] \
[-d nama database] [-t nama tabel] \
[-P password] [-f] [-c] file-dbf

Opsi - opsi yang digunakan :

-h

Opsi ini digunakan untuk menentukan host dari database server

-U

Opsi ini digunakan untuk menentukan user dari database server

-d

Opsi ini digunakan untuk menentukan nama dari database

-t

Opsi ini digunakan untuk menentukan nama dari tabel

-P

Opsi ini digunakan untuk menentukan password dari user database server

-f

Opsi ini digunakan untuk mengubah nama field menjadi huruf kecil (lowercase)

-c

Opsi ini digunakan untuk membuat table di database server, jika tabel belum ada.

Sekian saja pembahasan tentang penggunaan dbf2mysql. Untuk selengkapnya bisa anda lihat di manualnya.

Selamat Tahun Baru 2008

Optimasi Left Join Dengan Subquery di MySQL

Monday, September 3rd, 2007

Left Join adalah salah satu dari beberapa tipe join yang terdapat di SQL untuk mengkombinasikan lebih dari satu tabel. Mengkombinasikan lebih dari satu tabel akan mempengaruhi kecepatan suatu query dalam berinteraksi dengan database. Hal ini akan mengakibatkan aplikasi lebih lambat menampilkan informasi. Pada tulisan kali ini saya akan mengambil contoh penggunaan Left Join dengan 2 tabel, yaitu tabel berita dan tabel komentar dengan key berita_id.

Tabel berita memiliki attribut berita_id, tanggal, judul dan berita. Tabel komentar memiliki attribut komentar_id, pengirim, email, komentar dan berita_id. Kedua tabel ini hanya merupakan sampel yang kondisinya memenuhi syarat untuk menggunakan LEFT JOIN. Kalaupun ada kesamaan tokoh, karakter dan lain sebagainya bukanlah disengaja (koq kayak filem ya? hihihihi)

Untuk menampilkan informasi dari berita dengan jumlah komentar pada setiap berita, dapat menggunakan query berikut :

SELECT A.berita_id, A.judul, A.berita, COALESCE(COUNT(B.komentar_id), 0)
AS total_komentar FROM berita A LEFT JOIN komentar B
USING(berita_id) GROUP BY A.berita_id ORDER BY berita_id DESC

Kenapa query di atas bisa menjadi lambat dengan data dalam jumlah besar?

Karena query tersebut menghitung jumlah key pada tabel sebelah kanan (komentar) sebanyak key pada tabel sebelah kiri (berita). Maka jika tabel berita berisi 4000 data dan tabel komentar berisi 8000 data, maka query diatas akan melakukan pengecekan jumlah komentar sebanyak 4000 kali terhadap 8000 data komentar.

Bagaimana cara mengoptimasinya?

Query diatas dapat dioptimasi dengan membuat tabel di sebelah kanan (komentar) jumlah datanya lebih kecil atau sama dengan jumlah data pada tabel sebelah kiri (berita), dan tidak menghitung key pada tabel sebelah kanan sebanyak jumlah key pada tabel sebelah kiri (berita). Untuk melakukan hal ini bisa dengan menggunakan subquery.

SELECT A.berita_id, A.judul, A.berita, COALESCE(B.total_komentar, 0)
AS total_komentar FROM berita A LEFT JOIN
(SELECT berita_id, COUNT(komentar_id) AS total_komentar
FROM komentar GROUP BY berita_id) B
USING(berita_id) GROUP BY A.berita_id ORDER BY berita_id DESC

Dari query diatas, dapat dilihat tabel sebelah kanan (komentar) berisi subquery yang menghasilkan attribut berita_id dan total_komentar dengan jumlah data yang lebih kecil atau sama dengan jumlah data pada tabel sebelah kiri (berita). Kemudian dengan tabel sebelah kiri dan kanan dikombinasikan tanpa ada penghitungan key pada tabel sebelah kanan sebanyak key pada tabel sebelah kiri. Query ini jika dieksekusi akan memakan waktu sebesar 0.01 detik jauh lebih kecil dari query yang sebelumnya.

Sejauh ini saya masih menggunakan subquery untuk mengoptimasi LEFT JOIN pada contoh kasus seperti di atas. Pada contoh kasus di atas penggunaan subquery meningkatkan waktu eksekusi sebesar 90%.

Menghapus Semua Tabel di Database

Tuesday, June 5th, 2007

Dalam MySQL, untuk menghapus sebuah tabel dapat menggunakan perintah DROP TABLE. Tapi bagaimana untuk menghapus semua tabel yang ada di database? Sementara ini perintah untuk menghapus semua tabel ini belum ada di MySQL. Lho, lantas bagaimana kalau kita ingin menghapus semua tabel? Apa dihapus satu persatu? Aduh, cape de…

Untuk mengatasi permasalahan diatas kita bisa menggunakan mysqldump dan sedikit shell script. Dapat dilihat pada contoh berikut :

mysqldump [-u username] [-ppassword] nama_database --no-data

--add-drop-table | grep ^DROP | xargs -0 mysql [-u username]

[-ppassword] nama_database -e

Penggunaan :

  • Opsi -u diatas bersifat optional. Artinya jika database anda tidak dimiliki oleh user tertentu opsi -u ini tidak diikut sertakan.
  • Opsi -p diatas bersifat optional. Artinya jika user dari database anda tidak memiliki password maka opsi -p ini tidak diikut sertakan.
  • nama_database diganti sesuai dengan database anda
  • Perintah ini hanya dapat dijalankan di unix shell dengan asumsi anda sudah menginstall mysqldump.

Update tabel menggunakan 2 tabel di MySQL

Saturday, May 12th, 2007

Adakalanya kita ingin mengupdate isi suatu field di dalam tabel dengan isi field di tabel lain. Sebenarnya ini tidak terlalu sulit, logikanya sama dengan SELECT menggunakan lebih dari satu tabel.

Disini saya akan memberi contoh perintah UPDATE dengan menggunakan dua tabel. Pada contoh berikut ini kita mempunyai tabel tabel1 dan tabel tabel2. Kita akan mengupdate field1 dari tabel1 dengan value field5 dari tabel2 dengan syarat value dari field1 di tabel1 sama dengan value field1 di tabel2. Berikut ini adalah perintahnya :

UPDATE tabel1, tabel2 SET tabel1.field2 = tabel2.field5
WHERE tabel1.field1 = tabel2.field2

Tidak sulit kan?
Dari contoh diatas bisa anda kembangkan lagi untuk mengupdate tabel dengan menggunakan lebih dari dua tabel.