Script สำหรับ Backup ข้อมูล ย้อนหลัง 7 วัน

อันนี้เป็น Script สำหรับ Backup ข้อมูลผ่าน rsync โดย Backup ย้อนหลัง 7 วัน (สามารถปรับได้)

สิ่งที่ต้องเตรียมก่อนใช้

  1. Linux/Unix Only
  2. ติดตั้ง rsync
  3. เครื่อง Backup ต้องสามารถ SSH Without Password เข้าเครื่องเป้าหมายได้ (ลองอ่านอันนี้ หรืออันนี้ดูครับ)
  4. เครื่อง Backup ต้องติดตั้ง PHP (ไม่จำเป็นต้องมี Apache)
  5. เครื่องเป้าหมายควรมี MySQL Tools (พวก mysqldump เป็นต้น) ในกรณ๊ต้องการสำรองข้อมูลจาก MySQL

Script ที่ใช้

<?php
chdir(__DIR__);

$SOURCE_HOST = '[email protected]';
$SOURCE_PATH = '/home/user/';

$MYSQL_USERNAME = "DATABASE_USERNAME";
$MYSQL_PASSWORD = "DATABASE_PASSWORD";

$dateFormat = 'Ymd';

$before = date($dateFormat,strtotime('yesterday'));
$dateKey = date($dateFormat);
$delDate = date($dateFormat,strtotime('-7 days'));

$excludeDirs = [
	'cache1/*',
	'cache2/*',
];

system("ssh {$SOURCE_HOST} \"mysqlcheck --all-databases -u{$MYSQL_USERNAME} -p{$MYSQL_PASSWORD} -r\"");
system("ssh {$SOURCE_HOST} \"mysqldump -u {$MYSQL_USERNAME} -p{$MYSQL_PASSWORD} --lock-tables=false --all-databases  | gzip --rsyncable -f -c - > {$SOURCE_PATH}/backupdb/backup.sql.gz\"");

system("cp -al {$before} {$dateKey}");

$excludeStr = '';
foreach($excludeDirs as $dir){
        $excludeStr .= " --exclude '{$dir}'";
}

system("rsync -a --delete {$excludeStr} {$SOURCE_HOST}:{$SOURCE_PATH} {$dateKey}/");

if(!empty($delDate)){
system("rm -rf ./{$delDate}");
}

echo "COMPLETE";

อธิบายคำสั่ง

บรรทัดที่ 1 – 14 เป็นการตั้งค่าเครื่องเป้าหมาย ว่าจะ backup จาก host ใดและ path ใด ข้อมูลการเข้าถึง Database และจำนวนวันที่ backup ย้อนหลัง โดยสามารถตั้งวันที่ backup สูงสุดได้ในบรรทัดที่ 14

บรรทัดที่ 16-19 เป็นการตั้งค่าว่าจะไม่ backup file ใด้บ้าง เช่นพวก cache เราอาจจะไม่ backup เป็นต้น

บรรทัดที่ 21-22 เป็นการสั่ง backup ฐานข้อมูล ให้ออกมาเป็น file.sql

บรรทัดที่ 24 เป็นการสั่งคัดลอก folder เมื่อวาน แบบ Hardlink มาเป็นโฟลเดอร์วันที่ปัจจุบัน โดยการทำ Hardlink จะช่วยประหยักเนื้อที่ได้มากในกรณีที่ไม่เปลี่ยนแปลง เช่นถ้าเราสั่งคัดลอก a.zip ขนาด 1GB ไปเป็น b.zip แบบ Hardlink ขนาดที่จะถูกใช้บน Harddisk จะถูกใช้แค่ 1GB เท่านั้น ไม่ใช่ 2GB แบบปกติ เพราะไฟล์เก็บที่เดียวกัน (อ่านเพิ่มเติมได้ที่นี่)

บรรทัดที่ 26-29 เป็นการสร้าง exclude parameter หรือก็คือเอา บรรทัด 16-19 มาแปลงให้ rsync เข้าใจได้

บรรทัดที่ 31 เป็นการสั่ง rsync จากต้นฉบับมาโฟลเดอร์ปัจจุบัน โดยจะดึงเฉพาะไฟล์ที่มีการเปลี่ยนแปลงหลังจากเมื่อวานเท่านั้น ทำให้ Backup ได้อย่างรวดเร็ว

บรรทัดที่ 33-35 คือสั่งให้ลบโฟลเดอร์ backup ที่เกิน 7 วันทิ้ง

คำแนะนำอื่นๆ

อย่าใช้ script นี้ผ่าน http เพราะมันจะ timeout ให้ตั้ง cronjob เป็นประมาณ php backup.php

ในกรณที่ MySQL เราใช้แต่ InnoDB และไม่มี MyISAM สามารถเอาบรรทัดที่ 21 ออกได้ (บรรทัด mysqlcheck) เพราะ check ไปก็ทำไรไม่ได้ InnoDB ไม่ Support

ในบรรทัดที่ 22 เราจะเห็นว่ามี –lock-tables=false ซึ่งหมายถึงเราจะไม่ lock table ในการเขียน ซึ่งทำให้เว็บสามารถทำงานได้ปกติตอน dump ข้อมูลออก แต่ข้อมูลที่ได้อาจจะไม่ตรงกัน เช่น table a ถึก dump เสร็จแล้ว ในระหว่างที่ dump table b ออกมา มีการเขียนที่ table a และ c ซึ่ง table c ต้องใช้ข้อมูลจาก table a แบบนี้จตะเกิดปัญหาได้ เพราะ table c ที่ถูก dump มีข้อมูลบางอย่างที่ต้องพึ่ง table a แต่ตอน dump table a ตัว table a ยังไม่มีข้อมูลนั้น ทางแก้มี 2 แบบ

  1. ตั้ง –lock-tables=true
  2. ในกรณีที่มีแต่ InnoDB ให้ใช้ –single-transaction แทน

 

 

 

มาทดสอบความเร็วอินเตอร์เน็ตของเซิฟเวอร์ที่เราใช้โดยไม่ต้องลง GUI กัน

เนื่องจากผมมีความจำเป็นบางอย่าง ต้องทำการทดสอบความเร็วอินเตอร์เน็ตของเซิฟเวอร์ผม (ตอนลง H@H Client ต้องส่งหลักฐานความเร็วอินเตอร์เน็ต) แต่ว่าผมไม่อยากลง GUI ให้เป็น Overhead เซิฟเวอร์ เลย Google เอา เจอ 1 ลิงค์ ที่นี่ครับ

สิ่งที่ต้องการ

  • SSH เข้าเซิฟเวอร์ที่เราจะทดสอบ
  • Python เวอร์ชัน 2.4.3+
  • wget หรือ curl หรืออะไรก็ได้ที่โหลดไฟล์ได้ ตามสะดวกเลย

มาลองเล่นกัน

  1. ขั้นแรก SSH เข้าเซิฟเวอร์ก่อน
  2. ต่อมา ต้องโหลดตัว Speedtest-cli ก่อน โดยใช้คำสั่งนี้
    wget -O speedtest-cli.py https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py
  3. ต่อมา เราก็สามารถใช้ได้เลย โดยใช้คำสั่งต่อไปนี้
    python speedtest-cli.py

    เราจะได้ ข้อมูลมาประมาณนี้ครับ

    Retrieving speedtest.net configuration...
    Retrieving speedtest.net server list...
    Testing from CS LoxInfo (27.254.141.216)...
    Selecting best server based on latency...
    Hosted by STS Group (Bangkok) [1.79 km]: 2.138 ms
    Testing download speed........................................
    Download: 892.58 Mbit/s
    Testing upload speed..................................................
    Upload: 592.59 Mbit/s
    

    ซึ่งในข้อมูลจะมีบอกว่า Test จากไหน และ Test ไปที่ไหน (ในตัวอย่างไม่ได้ระบุปลายทาง มันจะเลือกที่ที่ใกล้ที่สุดครับ) ความเร็ว Download และ Upload เท่าไหร่

    เดี๋ยวก่อน มันยังไม่หมดแค่นั้น เรายังสามารถให้ script นี้ทำการแชร์ภาพเป็นหลักฐานให้คนอื่นได้ด้วย โดยสั่ง

    python speedtest-cli.py --share

    (เติม –share ต่อท้าย) จะได้ผลลัพธ์คล้ายๆเดิม แต่มีลิงค์สำหรับแชร์ติดมาด้วย

  4. สามารถใช้ คำสั่งนี้เพื่อดู Option ต่างๆที่ใช้ได้ครับ
    python speedtest-cli.py --help

ถ้าอยากทดสอบความเร็วออกต่างประเทศละ?

ง่ายนิดเดียวครับ ขั้นแรก โหลดไฟล์ด้านบนมาก่อนครับ จากนั้น

  1. ให้สั่งคำสั่งนี้ เพื่อดูว่าเราทดสอบกับเซิฟเวอร์ไหนได้บ้างก่อนครับ
    python speedtest-cli.py --list
  2. จะได้ผลลัพธ์ประมาณนี้มาครับ
    Retrieving speedtest.net configuration...
    Retrieving speedtest.net server list...
    2459) SBN (Bangkok, Thailand) [1.79 km]
    3855) dtac (Bangkok, Thailand) [1.79 km]
    3147) AIS (Bangkok, Thailand) [1.79 km]
    4222) Shama Thunder (Bangkok, Thailand) [1.79 km]
    1219) STS Group (Bangkok, Thailand) [1.79 km]
    5609) Internet Thailand PCL (Bangkok, Thailand) [1.79 km]
    4347) cattelecom (Bangkok, Thailand) [1.79 km]
     428) adslthailand.com (Bangkok, Thailand) [1.79 km]

    2 บรรทัดแรกไม่ต้องสนใจครับ สนใจบรรทัดถัดๆมาดีกว่าครับ มันจะจัดในรูปแบบ

    ID) ชื่อสถานที่ (เมือง,ประเทศ) [ระยะห่าง]

    อย่างเช่นผมต้องการทดสอบความเร็วไปที่ประเทศญี่ปุ่น ผมก็เลือกบรรทัดนี้

    4497) Globe Telecom (Tokyo, Japan) [4612.39 km]

    จากบรรทัดที่ผมเลือกจะเห็นว่า ID เป็น 4497 เราก็จะเอาตรงนี้ไปใช้กับขั้นต่อไปครับ

  3. เราจะใช้คำสั่งต่อไปนี้ เพื่อบังคับให้มันใช้เซิฟเวอร์ปลายทางที่เรากำหนด
    python speedtest-cli.py --server=4497

    เพียงเท่านี้เราก็ทดสอบความเร็วออกนอกประเทศได้แล้วครับ
    เราสามารถใช้คำสั่งนี้ร่วมกับ –share เพื่อเอาลิงค์ภาพได้ครับ

บันทึกทำ RAPTOR ให้ RUN แบบ Command Line บน Linux ได้

แบบสำเร็จรูป

ดาวโหลดนี่ WineINW มัน เป็น .wine ให้เอาไปใส่ใน home folder ของ user ที run (ตัวนี้ยังไม่สามาร ใช้ /compile ได้ ถ้าอยากใช้ต้อง PATCH ก่อน ดูด้านล่งสุด)

วิธีใช้

  1. ให้ แตก wine_inw.tar.gz ไปไว้ที่ ~ (home directory)
  2. จบแลว แต่เพื่ทดสอบให้ลองสร้าง test.rap ให้สั่งปริ้นอะไรออกมาก็ได้ แลวสั่ง
    wine C:\\RAPTOR\\raptor.exe ./test.rap /run in.txt out.txt (หรือแบบนี้หว่าจำไม่ได้ wine C:\\RAPTOR\\raptor.exe ./test.rap /run < in.txt > out.txt ลองทำทั้ง 2 แบบแล้วกัน)
    จำเป็นต้องใช้ ./test.rap ไม่สามารถย่อเหลือแค่ test.rap ได้ เพราะมันจะ bug เหมือนมันไม่มองเป็น path ไรนี่แหละขี้เกียจดู 

วิธีทำแบบยาว

  1. ต้องแก้ Code โดยทำตามนี้ก่อน
  2. จากนั้นสามารถโหลด Code ตัวนี้ไป Compile เพื่อให้ได้ RAPTOR ที่สามารถใช้งานบน Pure CLI ได้
  3. หลังจาก Compile แล้ว ถ้าเป็นตาม code ผม เหมือนจะวางไฟล์ผิด ให้เอา raptor.exe ใน bin/Debug ไปวางทับของปกติ ถึงจะสามารถใช้ได้
  4. ต่อ มาเราต้องเตรียม Linux(ผมทำสอบบน ubuntu 12.04) โดยตอนนี้ต้องเป็น linux desktop เท่านั้น เพื่อให้สามารถลง .NET Framework และ Mono ได้
  5. ลง wine ( sudo apt-get install wine )
  6. หลัง จากนั้นให้ติดตั้ง .NET Framework(ถ้าจำไม่ผิดใช้ 2.0 กับ 4.0 แต่ถ้าไม่ลงก็อาจจะได้เหมือนกัน) และ Mono ผ่านทาง winetricks (ทางอื่นน่าจะได้ แต่แบบนี้สำหรับผมง่ายดี)
  7. กอปตัว RAPTOR ทั้งหมดมาวางใน ~/.wine/drive_c/ หรือที่อื่นก็ได้ตามสะดวกแหละ
  8. จากนั้นลองทดสอบตามด้านบนดู (ถ้าถูกต้อง มันจะไม่มี MsgBox หรือ GUI อะไรเด้งขึ้นมาทั้งนั้น)
  9. ถ้าทดสอบแล้วผ่าน ให้กอป ./wine ไปวางที่ home directory ของ user ที่จะใช้บน server ได้
  10. ติดตั้ง wine บน server

จบ

Patch สำหรับทำห้ใช้ /compile ได้

สามารถ Download ได้จากที่นี่ หรือเอาจากที่ compile ใหม่จากด้านบนก็ได้ โดยเอาไปวางทับใน ~/.wine/drive_c/RAPTOR/ จบ

วิธีใช้คือ สั่ง wine C:\\RAPTOR\\raptor.exe ./test.rap /compile จะได้ compiled.exe ออกมา(ขี้เกียจทำชื่อ dynamic เลย fix ชื่อนี้เลย 55)
สามารถสั่งให้ทำงานได้โดย wine ./compiled.exe 

เพิ่มเติม

เนื่องจากปกติ wine เปิด Debug ไว้ทำให้มันจะมีอะไรหลุดมาตอน run เป็นพรวนเลย สามารถเอาออกได้โดยการสั่ง WINEDEBUG=-all ไว้ด้านหน้า เช่น
WINEDEBUG=-all wine C:\\RAPTOR\\raptor.exe ./test.rap /run < in.txt > out.txt หรือ
WINEDEBUG=-all wine ./compiled.exe

ข้อมูลสำคัญที่จะเป็นน่าจะหมดแล้ว คราวหน้าเวลางมต่อจะได้ง่ายๆ 555

XAMPP ไม่สามารลงบน Ubuntu Linux แบบ 64 Bits ได้

สำหรับท่านใดที่ลง XAMPP บน Ubuntu หรือ Linux 64 bits  แล้วไม่สามารถสั่ง start ได้ จะต้องลง package เพิ่มนะครับ วิธีลงก็ตามนี้เลยครับ

สำหรับสาย Debian

sudo apt-get install ia32-libs

หรือหากเป็นสาย Redhat หรือ CentOS

sudo yum install glibc*