BMS-HOSxP Community

HOSxP => Development => ข้อความที่เริ่มโดย: draran ที่ ธันวาคม 27, 2014, 19:48:47 PM

หัวข้อ: shell script สำหรับ tranfer database(หรือ import databas)
เริ่มหัวข้อโดย: draran ที่ ธันวาคม 27, 2014, 19:48:47 PM
ว่างเว้นจากงานเขียนโปรแกรมไปนาน เนื่องจากภาระกิจงานบริหาร พอจะมาเขียน web service ตัวใหม่ต่อ งานแรกที่ต้องทำคือ เอาฐานข้อมูล hosxp จาก server เข้าเครื่อง macbook air(Yosemite OSX 10.10) ที่ใช้งานประจำ ลองลง MariaDB 10.1 ผ่าน Macport แทน MySQL เพราะ support InnoDB มากกว่า เข้า Parallel Desktop เพื่อเข้า hosxp ที่อยู่บน windows และจัดการ initial import โดยกำหนด slave มาที่ MBA ช่วงแรกก็เร็วดี เดินไปชงกาแฟ กลับมา error : out of memory อืมม์ อาจเพราะรันบน Virtual Machine Memory เลยไม่พอ จำต้องหา เครื่อง windows มาช่วย run initial import แทน แต่ก็เกิดอาการเดียวกัน ลองเพิ่ม thread ก็กลับมาวิ่งได้ซักพัก ก็ out of memory ต่อ ต้องคอยเฝ้า เพิ่ม thread กันไม่ต้องหลับต้องนอน จนสุดท้าย แจ้ง error ว่า พื้นที่การจัดเก็บไม่พอ ยอมแพ้ เรียกน้อง IT มาสอบถาม เพราะไม่ได้จับเสียนาน ได้ความว่า GUI ใหม่ใช้ Memory มากในการ initial import (ทั้งฝั่ง client และ server) ส่วน ปัญหาอื่นเช่น mysql ตัดไปเป็นบางช่วง ในตาราง image บางตารางเพราะไฟล์ขนาดใหญ่กว่า max_allow_package ส่วนที่พื้นที่จัดเก็บไม่พอน่าจะเกิดจาก log file(ซึ่งตอนเขียนโปรแกรมไม่ใคร่จะจำเป็นสำหรับผม) และโปรแกรมอื่นที่ใช้ฐานร่วมกับ hosxp(เช่น ulog)  น้อง IT แนะนำว่า ให้ downgrade version ลง เพื่อ inital import หรือ ไม่ก็ backup แบบไม่เก็บรูปกับ log แล้วค่อย restore และ upgrade structure ภายหลัง ซึ่งทุกวิธีต้องทำผ่าน windows
เลยเกิดความคิดว่า ไหนๆก็ไหนๆ เขียน script เพื่อนำเข้า ผ่าน shell script ดีกว่า ใช้ได้ทั้งบน OSX และ Linux ซึ่งน่าจะเป็นประโยชน์กับ admin ในการนำเข้า Database ผ่าน commandline ได้เลย สะดวกดี

คุณสมบัติ
- ลบ/สร้าง  database ขึ้นใหม่ได้เลย(ยืนยันการ drop database เดิมก่อน สร้างใหม่และนำเข้า)
- สามารถ เลือกตารางที่ไม่ต้องการนำเข้า(ตารางที่ไม่ใช่ของ hosxp) หรือ นำเข้าเฉพาะ structure (log table) โดยกำหนดรูปแบบ หรือจำเพาะเจาะจง
-ใช้การ dump และ restore ทีละตารางแทนการ dump ทั้ง database ที่จะทำให้ไฟล์ .sql มีขนาดใหญ่ นำเข้าได้ช้า และเปลือง Memory
- สามารถนำไปปรับใช้ในการนำเข้าหรือถ่ายข้อมูล MySQL ได้ทุกๆฐานข้อมูล

การใช้งานและการปรับแก้

-เปิดไฟล์ hosxpimport.sh โดย texteditor ตามถนัด( เช่น vi)
-ใส่ข้อมูลส่วนของ server ฐานข้อมูลต้นทาง และ server ปลายทาง อาจอยู่ในเครื่องที่ run script หรือต่างเครื่องก็ได้
โค๊ด: [Select]
## Master sever
master_ip="";
master_user="";
master_pass="";
master_db="";

## Import sever
import_ip="";
import_user="";
import_pass="";
import_db=""; #drop database if existe; create database if not.

กรณี import_db มีอยู่แล้ว จะมีการตรวจสอบและถามยืนยันว่าต้องให้ลบฐานข้อมูลดังกล่าว เพื่อสร้างใหม่หรือไม่? (ตอบ y ใช่ / n ยกเลิก)

โค๊ด: [Select]
Database  already exist. Do you wish to drop database and create new one?(y/n)

- ปรับแต่งตารางที่ต้องการนำเข้าหรือไม่ต้องการนำเข้า(ถ้าไม่ต้องการปรับแก้ข้ามไป)
โค๊ด: [Select]
## Get table name without log
echo "show tables;" | mysql -h $master_ip -u $master_user -p$master_pass $master_db |grep -v '^Tables_in_'|grep -v '_log$'|grep -v 'data_synchronize'|grep -v 'ksklog'|grep -v '^ulog_' > tables.txt

รูปแบบ |grep -v ‘xxxx’ หมายถึง ไม่นำตาราง xxxx เข้า   
|grep -v ‘^xxxx’ หมายถึง ไม่นำตารางที่ขึ้นด้วย xxxx เข้า
|grep -v ‘xxxx$’ หมายถึง ไม่นำตารางลงท้ายด้วย xxxx เข้า

หมายเหตุ การไม่นำตารางของ  hosxp เข้าต้องไม่ลืมนำเข้า structure(ในขั้นถัดไป) มิฉะนั้นจะทำให้เข้าใช้งานไม่ได้ หรือต้องทำ upgrade structure ผ่าน windows

- ปรับแต่งตารางที่ต้องการนำเข้าเฉพาะ structure (ถ้าไม่ต้องการปรับแก้ข้ามไป)

โค๊ด: [Select]
## Get log table or other table name
echo "show tables;" | mysql -h $master_ip -u $master_user -p$master_pass $master_db |grep -e '_log$' -e 'data_synchronize' -e 'ksklog' > logs.txt

รูปแบบ -e ‘table_name’

-บันทึกไฟล์ที่ปรับแก้
- กำหนดสิทธิ์ให้สามารถ run ได้ โดยพิมพ์คำสั่ง ใน terminal
โค๊ด: [Select]
chmod +x hosxpimport.sh
-run script โดยพิมพ์คำสั่ง ใน terminal
โค๊ด: [Select]
./hosxpimport.sh
- script จะสร้าง database อัตโนมัติกรณียังไม่มี กรณีมีอยู่แล้ว จะยืนยันเพื่อลบและสร้างใหม่ หลังจากนั้น script จะ แสดงกระบวนการนำเข้า ชื่อตารางที่ดำเนินการอยู่ ขั้นตอนต่างๆ error(กรณีที่มี แต่จะ run ต่อแม้มี error )
- ไปชงกาแฟ  ;D
- เมื่อสิ้นสุด จะแสดงระยะเวลาที่ใช้ไปทั้งหมด (ขึ้นอยู่กับฐานข้อมูล และความเร็วเครื่อง) นำเข้าข้อมูล รพ.ทุ่งยางแดง ขนาดประมาณ 30 GB เข้า ใน Macbook Air Yosimite OSX 10.10 กับ ฐานข้อมูล MariaDB 10.1 ใช้เวลา 80 นาที ทดสอบการเข้าใช้โดยไม่ได้ upgrade structure login ใช้ได้ปกติ ไม่ได้แสดงข้อความ error อะไร ถือว่า ไม่เร็ว แต่ก็ไม่เลวร้ายนัก ไม่ต้องหาเครื่อง windows อีกเครื่อง ไม่ต้อง backup-restore ไม่ต้อง downgrade
-ขอให้สนุกในการใช้งานครับ

**** แก้ไขไฟล์สำหรับตาราง Doraemon ครับ
**** แก้ไขไฟล์ error ECHO ครับ(เปลี่ยนเป็นตัวเล็ก echo ให้แล้วครับ)
หัวข้อ: Re: shell script สำหรับ tranfer database(หรือ import databas)
เริ่มหัวข้อโดย: Adeno Benzoate ที่ ธันวาคม 29, 2014, 11:19:56 AM
ลองรันแล้ว บรรทัดที่เป็น ECHO จะ Error ทุกอันเลยครับ

แล้วก็อีกอันคำสั่ง insert ตาราง doraemon ยังเขียน code เป็น localhost อยู่เลยครับ (บรรทัดถัดมาผมโมเพิ่มเองครับ  ;D)
หัวข้อ: Re: shell script สำหรับ tranfer database(หรือ import databas)
เริ่มหัวข้อโดย: draran ที่ ธันวาคม 29, 2014, 18:40:01 PM
แก้ไขไฟล์แล้วครับ ขอบคุณมากครับ ตรวจดูไม่ละเอียด
ไม่ทราบ RUN บนอะไรครับ ดูเหมือนจะ error จากหาบางคำสั่งไม่พบ ถ้ารันได้ปกติ จะแสดงตามภาพครับ
หัวข้อ: Re: shell script สำหรับ tranfer database(หรือ import databas)
เริ่มหัวข้อโดย: draran ที่ ธันวาคม 29, 2014, 20:49:11 PM
ลองตรวจสอบตำแหน่งของ command ที่เรียกใช้

โค๊ด: [Select]
$ echo $PATH
ผลที่ได้ ประมาณนี้
โค๊ด: [Select]
/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin:/usr/local/bin:/home/user/bin
นั่นคือ คำสั่งที่อยู่ใน /bin  /usr/bin o และ  /usr/local/bin สามารถเรียกใช้งานได้ทันที ในทุกตำแหน่ง มิฉะนั้นแล้วก็ต้องอ้างพาธเต็ม
วิธีการตรวจสอบพาธของคำสั่ง เช่น date echo
โค๊ด: [Select]
$ which date
โค๊ด: [Select]
$ which echo
หากไม่ต้องการอ้าง path ก็ต้องแก้ ไฟล์ .bashrc ใน Home Directory โดยใช้ text editor
โค๊ด: [Select]
$ vi $HOME/.bashrc
เพิ่ม path ที่คำสั่งที่อยู่ และต้องการเรียกใช้งาน เช่น
โค๊ด: [Select]
PATH=$PATH:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
export PATH

บันทึก  run คำสั่ง ตรวจสอบพาธ และสามารถเรียกใช้งานคำสั่งได้โดยตรง
โค๊ด: [Select]
$ source ~/.bashrc
$ echo $PATH
หัวข้อ: Re: shell script สำหรับ tranfer database(หรือ import databas)
เริ่มหัวข้อโดย: udomchok ที่ ธันวาคม 30, 2014, 01:40:19 AM
ว่างเว้นจากงานเขียนโปรแกรมไปนาน เนื่องจากภาระกิจงานบริหาร
สุดยอดดดดดดดดดดดดดดดดด...ห่างหายไปนานมากครับ สำหรับคุณหมออรัญ รอกา guru HOSxP อีกท่าน
กลับมาครั้งนี้ก็มีผลงานดี ๆ มาฝากอีกเช่นเคย
ขอบคุณครับ
หัวข้อ: Re: shell script สำหรับ tranfer database(หรือ import databas)
เริ่มหัวข้อโดย: Adeno Benzoate ที่ ธันวาคม 30, 2014, 11:16:16 AM
ลองตรวจสอบตำแหน่งของ command ที่เรียกใช้

โค๊ด: [Select]
$ echo $PATH
ผลที่ได้ ประมาณนี้
โค๊ด: [Select]
/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin:/usr/local/bin:/home/user/bin
นั่นคือ คำสั่งที่อยู่ใน /bin  /usr/bin o และ  /usr/local/bin สามารถเรียกใช้งานได้ทันที ในทุกตำแหน่ง มิฉะนั้นแล้วก็ต้องอ้างพาธเต็ม
วิธีการตรวจสอบพาธของคำสั่ง เช่น date echo
โค๊ด: [Select]
$ which date
โค๊ด: [Select]
$ which echo
หากไม่ต้องการอ้าง path ก็ต้องแก้ ไฟล์ .bashrc ใน Home Directory โดยใช้ text editor
โค๊ด: [Select]
$ vi $HOME/.bashrc
เพิ่ม path ที่คำสั่งที่อยู่ และต้องการเรียกใช้งาน เช่น
โค๊ด: [Select]
PATH=$PATH:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
export PATH

บันทึก  run คำสั่ง ตรวจสอบพาธ และสามารถเรียกใช้งานคำสั่งได้โดยตรง
โค๊ด: [Select]
$ source ~/.bashrc
$ echo $PATH

งงครับ  ;D ;D ;D ไม่สันทัด linux เอาซะเลย  :D :D :D
หัวข้อ: Re: shell script สำหรับ tranfer database(หรือ import databas)
เริ่มหัวข้อโดย: chitvichai ที่ ธันวาคม 30, 2014, 12:26:49 PM
ลองตรวจสอบตำแหน่งของ command ที่เรียกใช้

โค๊ด: [Select]
$ echo $PATH
ผลที่ได้ ประมาณนี้
โค๊ด: [Select]
/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin:/usr/local/bin:/home/user/bin
นั่นคือ คำสั่งที่อยู่ใน /bin  /usr/bin o และ  /usr/local/bin สามารถเรียกใช้งานได้ทันที ในทุกตำแหน่ง มิฉะนั้นแล้วก็ต้องอ้างพาธเต็ม
วิธีการตรวจสอบพาธของคำสั่ง เช่น date echo
โค๊ด: [Select]
$ which date
โค๊ด: [Select]
$ which echo
หากไม่ต้องการอ้าง path ก็ต้องแก้ ไฟล์ .bashrc ใน Home Directory โดยใช้ text editor
โค๊ด: [Select]
$ vi $HOME/.bashrc
เพิ่ม path ที่คำสั่งที่อยู่ และต้องการเรียกใช้งาน เช่น
โค๊ด: [Select]
PATH=$PATH:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
export PATH

บันทึก  run คำสั่ง ตรวจสอบพาธ และสามารถเรียกใช้งานคำสั่งได้โดยตรง
โค๊ด: [Select]
$ source ~/.bashrc
$ echo $PATH

งงครับ  ;D ;D ;D ไม่สันทัด linux เอาซะเลย  :D :D :D

ลองใช้ text editor แก้ code โดยเปลี่ยน
ECHO พิมพ์ใหญ่ เป็น echo พิมพ์เล็กดู  linux มัน case sensitive

ครับ
หัวข้อ: Re: shell script สำหรับ tranfer database(หรือ import databas)
เริ่มหัวข้อโดย: Adeno Benzoate ที่ ธันวาคม 30, 2014, 13:25:11 PM
ได้ละครับ เปลี่ยนตัวพิมพ์เล็กครับ  ;D ;D ;D
หัวข้อ: Re: shell script สำหรับ tranfer database(หรือ import databas)
เริ่มหัวข้อโดย: draran ที่ ธันวาคม 30, 2014, 16:21:18 PM
ขอบคุณครับ ที่แจ้งเรื่อง error แก้ไขไฟล์ที่ให้ download แล้วครับ พอดีใน mac มันไม่ error เลยไม่เอะใจ  ;D
หัวข้อ: Re: shell script สำหรับ tranfer database(หรือ import databas)
เริ่มหัวข้อโดย: draran ที่ ธันวาคม 31, 2014, 08:36:56 AM
ได้ละครับ เปลี่ยนตัวพิมพ์เล็กครับ  ;D ;D ;D

คุณ Adeno Benzoate ใช่เวลาเท่าไหร่ครับ อยากทราบเวลาการใช้งานใน server ปกติ (ของผมรันใน MBA)
หัวข้อ: Re: shell script สำหรับ tranfer database(หรือ import databas)
เริ่มหัวข้อโดย: Adeno Benzoate ที่ มกราคม 05, 2015, 08:59:36 AM
ผม dump ลง pc เหมือนกันครับ ใช้เวลาประมาณ 80 กว่านาทีครับ
หัวข้อ: Re: shell script สำหรับ tranfer database(หรือ import databas)
เริ่มหัวข้อโดย: Kumpol Khonburi ที่ มกราคม 06, 2015, 09:29:59 AM
*** เยี่ยม ... ขอบคุณ script นี้จริงๆ ดีและมีประโยชน์มากครับ ***
- ผมใช้เวลา 20 ชม. จากเดิมเคยใช้เวลา Initial 3-4 วัน ถือว่าเยี่ยมที่สุดเท่าที่เคยทำได้ตอนนี้แล้วครับ
*** แต่ถ้ามีวิธีไหนเร็วกว่านี้ได้บ้าง ก็อยากลองครับ ***
หัวข้อ: Re: shell script สำหรับ tranfer database(หรือ import databas)
เริ่มหัวข้อโดย: admin30 ที่ มกราคม 06, 2015, 10:23:11 AM
สุดยอดครับ เก็บความรู้ก่อน ;D ;D
หัวข้อ: Re: shell script สำหรับ tranfer database(หรือ import databas)
เริ่มหัวข้อโดย: Sukjai ที่ มกราคม 06, 2015, 15:04:33 PM
*** เยี่ยม ... ขอบคุณ script นี้จริงๆ ดีและมีประโยชน์มากครับ ***
- ผมใช้เวลา 20 ชม. จากเดิมเคยใช้เวลา Initial 3-4 วัน ถือว่าเยี่ยมที่สุดเท่าที่เคยทำได้ตอนนี้แล้วครับ
*** แต่ถ้ามีวิธีไหนเร็วกว่านี้ได้บ้าง ก็อยากลองครับ ***

---------------------------------------------------------------

ไม่รู้ว่า Database ประมาณ กี่ G ครับ

ของผม ใช้เวลาในการ Backup Restore มายังเครื่อง localhost ทำเป็นแบบ MyISAM ใช้โปรแกรม BK ตาม Link ข้างล่างนี้ครับ  Database ขนาด 60 G ทำเป็น MyISAM ได้ประมาณ 29 G ใช้เวลาประมาณ 2 ชั่วโมงกว่า

http://hosxp.net/index.php?option=com_smf&Itemid=28&topic=29226.msg255870#msg255870
หัวข้อ: Re: shell script สำหรับ tranfer database(หรือ import databas)
เริ่มหัวข้อโดย: Kumpol Khonburi ที่ มกราคม 06, 2015, 16:56:52 PM
*** เยี่ยม ... ขอบคุณ script นี้จริงๆ ดีและมีประโยชน์มากครับ ***
- ผมใช้เวลา 20 ชม. จากเดิมเคยใช้เวลา Initial 3-4 วัน ถือว่าเยี่ยมที่สุดเท่าที่เคยทำได้ตอนนี้แล้วครับ
*** แต่ถ้ามีวิธีไหนเร็วกว่านี้ได้บ้าง ก็อยากลองครับ ***

---------------------------------------------------------------

ไม่รู้ว่า Database ประมาณ กี่ G ครับ

ของผม ใช้เวลาในการ Backup Restore มายังเครื่อง localhost ทำเป็นแบบ MyISAM ใช้โปรแกรม BK ตาม Link ข้างล่างนี้ครับ  Database ขนาด 60 G ทำเป็น MyISAM ได้ประมาณ 29 G ใช้เวลาประมาณ 2 ชั่วโมงกว่า

http://hosxp.net/index.php?option=com_smf&Itemid=28&topic=29226.msg255870#msg255870

Database ประมาณ 120 G ครับ
ผมอยากทดลองใช้โปรแกรม BK เหมือนกันครับแต่พยายามติดตั้งตามคู่มือแล้ว
มันบอกว่าไม่สามารถติดต่อ Master/Slave ได้ครับไม่รู้เป็นเพราะอะไร
หัวข้อ: Re: shell script สำหรับ tranfer database(หรือ import databas)
เริ่มหัวข้อโดย: มนตรี บอยรักยุ้ยคนเดียว ที่ มกราคม 16, 2015, 13:56:45 PM
*** เยี่ยม ... ขอบคุณ script นี้จริงๆ ดีและมีประโยชน์มากครับ ***
- ผมใช้เวลา 20 ชม. จากเดิมเคยใช้เวลา Initial 3-4 วัน ถือว่าเยี่ยมที่สุดเท่าที่เคยทำได้ตอนนี้แล้วครับ
*** แต่ถ้ามีวิธีไหนเร็วกว่านี้ได้บ้าง ก็อยากลองครับ ***

---------------------------------------------------------------

ไม่รู้ว่า Database ประมาณ กี่ G ครับ

ของผม ใช้เวลาในการ Backup Restore มายังเครื่อง localhost ทำเป็นแบบ MyISAM ใช้โปรแกรม BK ตาม Link ข้างล่างนี้ครับ  Database ขนาด 60 G ทำเป็น MyISAM ได้ประมาณ 29 G ใช้เวลาประมาณ 2 ชั่วโมงกว่า

http://hosxp.net/index.php?option=com_smf&Itemid=28&topic=29226.msg255870#msg255870


นานไปไหม สำหรับ 60G
ที่ผม 60 G ใช้เวลาไม่เกิน 30 นาที