Postingan kali ini saya akan membagikan sebuah tutorial membuat sebuah engine crontab untuk memindahkan field suatu database ke database lain.
Tujuan dari pembuatan engine ini biasanya digunakan untuk membackup log sebuah website dimana isi log yang dipergunakan hanya dalam rentang waktu tertentu saja, misalnya log user login jika log ini dibiarkan saja pada database tentu saja semakin hari data lognya akan sangat banyak dan akan memberatkan akses ke database server.
Untuk itulah kita harus memindahkan log-log tersebut kesebuah database baru untuk meringankan kerja server.
Tutorial ini akan saya terapkan pada Ubuntu...
Oke langsung saja ketutorialnya,
Pertama buat sebuah file php baru lokasinya terserah anda, saya akan menempatkanya pada path /var/www/html/crontab/ dengan nama movedatabaselog.php kemudian isi dengan code berikut.
<?php
$host="localhost";
$user="root";
$pass="root";
$dbname1 = "source_logs";
$dbname2 = "backup_logs";
$db=mysql_connect($host,$user,$pass);
$sql2="USE $dbname2";
mysql_query($sql2,$db);
//cek any databse or not?
$sql = "SELECT * FROM user_logs";
$hsl1 = mysql_query($sql,$db);
if (!$hsl1) {
//create database if not exists
$sql4 ="CREATE DATABASE IF NOT EXISTS `backup_FE` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci";
mysql_query($sql4,$db);
$sql2="USE $dbname2";
mysql_query($sql2,$db);
//create table if not exists
$sql4 = "CREATE TABLE IF NOT EXISTS `user_logs` (
`id` bigint(20) NOT NULL,
`user_id` bigint(20) DEFAULT NULL,
`type` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`request_method` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`url` text COLLATE utf8_unicode_ci,
`parameter_json` text COLLATE utf8_unicode_ci,
`status` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`logable_id` int(11) DEFAULT NULL,
`logable_type` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`ip` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`device_type` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`device` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`platform` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`platform_version` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`browser` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`browser_version` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`app_version` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`android` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`ios` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`duration` decimal(10,4) DEFAULT NULL,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`deleted_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
mysql_query($sql4,$db);
//add primary key
$sql4 = "ALTER TABLE `user_logs` ADD PRIMARY KEY (`id`)";
mysql_query($sql4,$db);
//add auto increment
$sql4 = "ALTER TABLE `user_logs` MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT";
mysql_query($sql4,$db);
}
//begin backup
$sql = "SELECT * FROM user_logs";
$hsl2 = mysql_query($sql,$db);
$array2 = mysql_fetch_array($hsl2);
if (!$array2) {
//if empty field on database insert this
$sql2="USE $dbname2";
mysql_query($sql2,$db);
$sql2="INSERT INTO user_logs (user_id,type,request_method,url,parameter_json,status,logable_id,logable_type,ip,device_type,device,platform,platform_version,browser,browser_version,app_version,android,ios,duration,created_at,updated_at,deleted_at) ";
$sql2.="(SELECT user_id,type,request_method,url,parameter_json,status,logable_id,logable_type,ip,device_type,device,platform,platform_version,browser,browser_version,app_version,android,ios,duration,created_at,updated_at,deleted_at ";
$sql2.="FROM $dbname1.user_logs)";
mysql_query($sql2,$db);
} elseif ($array2) {
//if database was insert before so insert this
$sql2="USE $dbname2";
mysql_query($sql2,$db);
$sql2="INSERT INTO user_logs (user_id,type,request_method,url,parameter_json,status,logable_id,logable_type,ip,device_type,device,platform,platform_version,browser,browser_version,app_version,android,ios,duration,created_at,updated_at,deleted_at) ";
$sql2.="(SELECT user_id,type,request_method,url,parameter_json,status,logable_id,logable_type,ip,device_type,device,platform,platform_version,browser,browser_version,app_version,android,ios,duration,created_at,updated_at,deleted_at ";
$sql2.="FROM $dbname1.user_logs WHERE created_at > (SELECT created_at FROM $dbname2.user_logs ORDER BY created_at DESC LIMIT 1))";
mysql_query($sql2,$db);
//delete logs that are not used anymore
$sql3="USE $dbname1";
mysql_query($sql3,$db);
$sql3="DELETE FROM user_logs WHERE created_at < DATE_ADD(CURDATE(), INTERVAL -6 DAY)";
mysql_query($sql3,$db);
}
?>
Terakhir silahkan jalankan code php pada Crontab caranya dengan mengetikkan crontab -e dan masukkan code berikut.
0 0 * * 0 /usr/bin/php /var/www/html/crontab/movedatabaselog.php
Crontab tersebut dijalankan seminggu sekali setiap hari minggu jam 12 malam menit pertama.
Selanjutnya save, cara menggunakan editor vim atau nano saat mengedit crontab bisa lihat disini.
Untuk aturan lain dalam penjadwalan crontab bisa lihat disini.
Pahami code tersebut saya sudah menjelaskan tiap-tiap fungsi sql yang saya tulis, jika belum mengerti silahkan contact-us atau comment juga boleh.
Jika tidak mengerti sintax SQL silahkan lihat disini,
===DONE!===