Friday, May 7, 2010

Mysqldump untuk range data tertentu dan setting timezone


Bermula dari rencana untuk ngedump data database yang lama (misal 6 bulan yang lalu di dump), maka dicoba coba deh ngedump pake perintah “mysqldump”

Berikut contoh command dumpnya,

mysqldump -h [ip address] -u[user] -p[password] [dbname] [tablename] -w"row_date BETWEEN '2010-05-05 00:00:00' AND '2010-05-05 23:59:59'" > test.sql

maksud dari perintah tersebut, ngedump data hanya untuk tanggal 5 mei 2010 ajah (mula 00:00:00 mpe 23:59:59)

Tapi ada yang aneh, record datetime hasil dump berbeda dengan data yang ada pada table sebenernya,

Contoh:

1.       Record hasil dump

'2010-05-05 00:00:01',


2.       Record pada table sebenernya

2010-05-05 07:00:01       

Nah lho, ada perbedaan jam sebesar +7 jam, padahal maunya data yang didump dimulai dari jam 00:00:00

Setelah ngoprek tanpa hasil dari kemaren, barusan iseng ngeliatin header file hasil dump, header sbb:

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

Yep, Indonesia khan timezonenya +7, jadi suspect utama ada di settingan timezonenya,

Langkah pertama, cek di mysql sendiri, apa bener udah pake timezone yang bener, dari output perintah select now(), udah ngasilin waktu yang sama dengan system.

Langkah kedua, googling pake keyword: mysqldump timezone


Jadi intinya, tambahin option --skip-tz-utc buat nonaktipin timezone

Jadi perintah lengkapnya jadi kek gini:

mysqldump --skip-tz-utc -h [ip address] -u[user] -p[password] [dbname] [tablename] -w"row_date BETWEEN '2010-05-05 00:00:00' AND '2010-05-05 23:59:59'" > test.sql

Header file dump, jadi kek gini

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;


Cross check dengan data di table sebenernya, viola !!! udah match  :)

No comments:

Post a Comment