สคริปต์สำรอง เกี่ยวกับความปลอดภัยของข้อมูล วิธีลบสำเนาไฟล์เก่าโดยยังคงเก็บสำเนาไฟล์ล่าสุดไว้

วิธี การสำรองข้อมูลมีมากมาย แต่สำหรับฉันโดยส่วนตัวแล้วพวกเขามีข้อเสียซึ่งเป็นเหตุผลว่าทำไมฉันจึงไม่ใช้มัน การเขียนสคริปต์ง่ายๆ สองสามตัวทำได้ง่ายกว่า เช่น การใช้ชื่อเล่นค้างคาวหรือ PowerShell ในบทความนี้ ฉันจะบอกคุณว่าคุณสามารถตั้งค่าการสำรองข้อมูลโดยใช้สคริปต์ได้อย่างไร ฉันจะรวมมันและสร้างบันเดิล

โครงการสำรองข้อมูล

ในกรณีส่วนใหญ่ การสำรองข้อมูลจะเกิดขึ้นเพื่อบันทึกไฟล์บางไฟล์ มันสามารถเป็นภาพ เครื่องเสมือน, ไฟล์ผู้ใช้, การสำรองข้อมูล ฐานข้อมูล SQLยกเลิกการโหลดฐานข้อมูล 1C:Enterprise ฯลฯ การเก็บสำเนาสำรองของไฟล์เหล่านี้ไว้ในตำแหน่งอื่นนั้นถูกต้องมากกว่า ซึ่งอาจเป็นโฟลเดอร์เครือข่าย ไดรฟ์ภายนอก เทปไดรฟ์, เอฟทีพี ฯลฯ เพื่อความสะดวกฉันใช้เซิร์ฟเวอร์ ftp

ลองดูแผนภาพว่าทั้งหมดนี้เกิดขึ้นได้อย่างไร:

  1. คัดลอกหรือย้ายไปยังโฟลเดอร์เพื่อส่งไปยังไฟล์เก็บถาวร
  2. ตรวจสอบโฟลเดอร์เพื่อดูข้อมูลสำรองใหม่
  3. เราส่งไฟล์ไปยังไฟล์เก็บถาวรเมื่อ เซิร์ฟเวอร์เอฟทีพี
  4. การลบไฟล์สำรองเก่า

ในขั้นตอนแรก เราสร้างไฟล์ที่เราต้องคัดลอกไปยังเซิร์ฟเวอร์ FTP ของเรา ตอนนี้เราต้องคัดลอกมันไปยังโฟลเดอร์ ซึ่งเราจะส่งไปที่ FTP ในการดำเนินการนี้ คุณสามารถใช้คำสั่งง่ายๆ:

คัดลอก "PATH_TO_SOURCE_FOLDER\* C:\Backup\

ด้วยการรันคำสั่งนี้ ไฟล์ทั้งหมดของเราจะถูกคัดลอกไปที่ C:\Backup\ เติมเต็ม คำสั่งนี้สมเหตุสมผลถ้าคุณรวบรวมจาก สถานที่ที่แตกต่างกันการสำรองข้อมูลของคุณ ตอนนี้เราต้องการสคริปต์ที่จะตรวจสอบโฟลเดอร์เพื่อหาไฟล์ใหม่และส่งไปยังเซิร์ฟเวอร์ FTP ไฟล์เปล่า backup.ps1 และเขียนสคริปต์ต่อไปนี้ลงไป

$a = (รับ-โฮสต์).UI.RawUI $a.WindowTitle = "ซิงค์โฟลเดอร์ไปยัง Ftp" $ftp = "ftp://АДРЕС_FTP_СЕРВЕРА/" $localDirectory = "C:\Backup" $user = "ИМЯ_ПОЛЬЗОВАТЕЛЯ" $pass = "ПАРОЛЬ" $webclient = New-Object System.Net.WebClient $webclient.Credentials = New-Object System.Net.NetworkCredential($user,$pass) $Files = Get-ChildItem $localDirectory | Where {$_.LastWriteTime -gt (Get-Date).AddDays(-1)} foreach ($File in $Files) { $LocalFile = $File.FullName Write-Host "Getting $File from $localDirectory" -Foreground "Red" $webclient.UploadFile($ftp + $File, $LocalFile) Write-Host "Puting $File to $ftp" -Foreground "Yellow" } Write-Host "Finished Sync to $ftp" -Foreground "Green" !}

เรามาดูกันว่ามันทำงานอย่างไร สคริปต์นี้- ขั้นแรก ตัวแปรจะถูกตั้งค่าซึ่งระบุเซิร์ฟเวอร์ ชื่อผู้ใช้ รหัสผ่าน และโฟลเดอร์ต้นทาง จากนั้นในบรรทัด $Files = Get-ChildItem $localDirectory | โดยที่ ($_.LastWriteTime -gt (Get-Date).AddDays(-1)) เลือกไฟล์ทั้งหมดที่มีวันที่แก้ไขมากกว่า (-qt) มากกว่าวันที่ปัจจุบันลบ 1 วัน ที่นี่คุณสามารถปรับเปลี่ยนให้เหมาะกับตารางเวลาของคุณได้ ฉันสำรองข้อมูลทุกวัน จากนั้นเราดำเนินการวนซ้ำแต่ละไฟล์ที่ตรงตามเงื่อนไขและส่งไปยังเซิร์ฟเวอร์ FTP

เพื่อไม่ให้กินพื้นที่ดิสก์ ฉันจะลบข้อมูลสำรองที่เก่ากว่า 30 วัน โดยหลักการแล้ว หลังจากส่งไปที่ FTP แล้ว คุณสามารถลบได้ทันที โดยจะทิ้งไว้เพียงเพื่อว่าหากจำเป็นโดยกะทันหัน ฉันก็จะได้ไม่ต้องเสียเวลาดาวน์โหลดจาก FTP และ สำเนาพิเศษการสำรองข้อมูลจะไม่เสียหาย คุณไม่มีทางรู้ได้เลยว่าจะเกิดอะไรขึ้นกับ FTP ดังนั้นหากพื้นที่ของคุณอนุญาต ฉันขอแนะนำให้จัดเก็บไว้ในเซิร์ฟเวอร์เดิม

ในการล้างโฟลเดอร์ ฉันใช้สคริปต์ RemoveOldBackups.ps1

$fullTargetPath = "C:\Backup" $deleteFiles = Get-Childitem $fullTargetPath -Recurse |

โดยที่ ($_.LastWriteTime -lt (รับ-วันที่).AddDays(-30)) | Foreach ( ลบรายการ $_.FullName -Force -Recurse)สคริปต์ที่ง่ายมาก ฉันจะอธิบายเพียงสิ่งเดียวเท่านั้น สตริงที่ไหน($_.LastWriteTime -lt (รับ-วันที่).AddDays(-30)) | บรรทัดนี้เปรียบเทียบวันที่แก้ไขไฟล์กับวันที่ปัจจุบันลบ 30 วัน การเปรียบเทียบนี้จะรวมไฟล์ที่ LastWriteTime น้อยกว่า

วันที่ปัจจุบัน

ลบ 30 วัน หากจำเป็น คุณสามารถปรับเปลี่ยนให้เหมาะกับความต้องการของคุณได้ คำนำแนวคิดในการสร้างสคริปต์ที่สามารถสร้างสำเนาสำรองของไซต์ (ไฟล์ทั้งหมด + ดัมพ์ฐานข้อมูล) ได้ในไม่กี่คลิกปรากฏขึ้นในขณะที่ฉันกำลังทำงานหลายโครงการ และกำลังพัฒนาและทดสอบที่

เว็บเซิร์ฟเวอร์ท้องถิ่น

- ถึงอย่างนั้น ฉันก็มีเดนเวอร์ ซึ่งเมื่อเวลาผ่านไปก็ถูกแทนที่ด้วยบริการเว็บแบบผสมผสานในท้องถิ่นที่มีการพัฒนาอย่างรวดเร็วยิ่งขึ้น - OpenServer

มีการเยี่ยมชมโปรเจ็กต์ต่างๆ ดังนั้น อันดับแรกจึงทำสำเนาทั้งไซต์ในเครื่อง และหลังจากนั้นจึงจะสามารถทำงานและทดลองกับโปรเจ็กต์ดังกล่าวได้ โดยหลีกเลี่ยงการหยุดชะงักในการทำงานของโปรเจ็กต์ที่ใช้งานอยู่ ฉันได้สำรองข้อมูลดังนี้: ฉันเข้าสู่ระบบผ่าน SSH และบรรจุโฟลเดอร์โปรเจ็กต์ด้วยโปรแกรมเก็บถาวร 7Zip หรือ TGZ สร้างดัมพ์โดยใช้ mysqldump และดาวน์โหลดเนื้อหาทั้งหมดนี้ผ่านทางเว็บหรือ SCP/WinSCP

ความเกียจคร้านทำให้ตัวเองรู้สึกได้ในทันทีและความคิดเกี่ยวกับระบบอัตโนมัติก็เกิดขึ้น: “คงจะดีมากถ้าทุกสิ่งที่ฉันพิมพ์ลงในคอนโซลถูกทำให้โดยอัตโนมัติสำหรับแต่ละไซต์ และฉันก็คลิกเพียงไม่กี่ครั้งเท่านั้น” การค้นหาโซลูชันอัตโนมัติ SSH สำหรับ Windows ครั้งแรกทำให้ฉันได้พบกับยูทิลิตี้ที่ฉันใช้มาเป็นเวลานานในการทำงานกับไฟล์บนเซิร์ฟเวอร์ - .

  1. สคริปต์สำรองข้อมูลทำงานอย่างไร
  2. ดังนั้นสาระสำคัญของสคริปต์สำรองข้อมูลอัตโนมัติจึงเป็นดังนี้:
  3. เราเปิดตัวโปรแกรม WinSCP ซึ่งล็อกอินเข้าสู่เซิร์ฟเวอร์และสร้างสำเนาสำรองของไซต์ + ฐานข้อมูล และยังเก็บข้อมูลทั้งหมดโดยใช้ Archiver ด้วย ระดับสูงการบีบอัด - 7Zip หรือ TAR+GZip;
  4. ดาวน์โหลดไฟล์เก็บถาวร;
  5. ปิด WinSCP และล้างบันทึก + ลบสคริปต์ที่สร้างขึ้นชั่วคราวสำหรับ WinSCP ด้วยคำสั่ง
  6. พร้อม! ต้องการสำเนาของไซต์อื่นหรือไม่? - ไปที่ 1!

อาจไม่มีเพียงหนึ่งไซต์ แต่มีหลายไซต์ ดังนั้นจึงเป็นไปได้ที่จะใช้ไฟล์ ini จำนวนมากด้วย การตั้งค่าแยกต่างหากสำหรับแต่ละไซต์

การประมวลผลและการจัดการ WinSCP ทั้งหมดจะดำเนินการโดยสคริปต์ เขียนด้วยภาษาสคริปต์ของไฟล์ bat สำหรับ Windows นอกจากนี้ยังมีอินเทอร์เฟซคอนโซลแบบธรรมดาที่ให้คุณดำเนินการที่จำเป็นทั้งหมดได้

สำหรับงานนี้ตามความเรียบง่ายภาษาสคริปต์ของไฟล์ค้างคาวก็ค่อนข้างเพียงพอ แต่ก็ยังไม่มีใครรบกวนการนำระบบนี้ไปใช้ใน Autoit หรือในภาษาการเขียนโปรแกรมภาษาใดภาษาหนึ่ง ระดับสูงเช่น C#, Delphi เป็นต้น

ความสนใจ! สคริปต์จะเกี่ยวข้องเฉพาะเมื่อคุณมีสิทธิ์เข้าถึงคอนโซลเซิร์ฟเวอร์ผ่าน SSH

อินเทอร์เฟซและเมนูสำรอง

หลังจากรันสคริปต์แล้ว เราจะสามารถเข้าถึงเมนูง่ายๆ:

รายการแรก (กด 1 และป้อน) รับผิดชอบกระบวนการสำรองข้อมูลและแสดงรายการไฟล์การกำหนดค่าเทมเพลตที่มีอยู่สำหรับไซต์

จุดที่สองคือการสร้างเทมเพลตไฟล์การกำหนดค่าและเปิดขึ้นมาเพื่อแก้ไข

จุดที่สาม - ข้อมูลโดยย่อในการเขียนไฟล์เทมเพลต

ในรูปด้านล่าง เมนูจะเปิดขึ้นพร้อมตัวเลือกเว็บไซต์ที่สามารถจองได้:

ที่นี่รายการย่อย "0. ไซต์ทั้งหมดที่แสดงด้านล่าง" มีหน้าที่รับผิดชอบในการเริ่มต้นการสำรองข้อมูลของไซต์ทั้งหมดด้วยไฟล์การกำหนดค่าตามรายการด้านล่าง ดังนั้นคุณจึงสามารถสำรองข้อมูลหนึ่งไซต์หรือทั้งหมดพร้อมกันได้

ตัวอย่างไฟล์การกำหนดค่าสำหรับสคริปต์

นี่คือตัวอย่างไฟล์การกำหนดค่า somesite.com.ini สำหรับการสำรองข้อมูล somesite.com:

Sitename_string=somesite_com store_path=D:\Backup\ archive_method=7z archive_password=StrOngp@sswOrd ชื่อโฮสต์=000.111.222.333 ssh_user=root ssh_password=p@ssmetotheserver mysql_user=site1_user mysql_password=PZBkOyjMmxWgQHhd 185g mysql_db_name =site1_db dirs_to_backup=/var/www/somesite. com /www/* /var/www/somesite.com/www/.htaccess

อย่างที่คุณเห็นทุกอย่างเรียบง่ายและไม่มีอะไรฟุ่มเฟือย ฉันจะบอกคุณโดยละเอียดเกี่ยวกับการตั้งค่าแต่ละบรรทัด:

sitename_string - กำหนดชื่อที่ชัดเจนให้กับไซต์ (เฉพาะภาษาละตินและสัญลักษณ์ _)

store_path - เส้นทางไปยัง คอมพิวเตอร์ท้องถิ่นโดยที่ไฟล์สำรองข้อมูลจะถูกดาวน์โหลด

archive_method - วิธีการเก็บไฟล์ไซต์

  • 7z - จะใช้ไฟล์เก็บถาวรที่มีชื่อเดียวกัน เอาต์พุตจะเป็นไฟล์เก็บถาวรที่มีนามสกุล "zip"
  • gz - การเก็บถาวรโดยใช้ TAR+GZip ผลลัพธ์จะเป็นไฟล์เก็บถาวรที่มีนามสกุล "tgz"

archive_password - รหัสผ่านการเก็บถาวร ใช้งานได้เฉพาะเมื่อ archive_method=7z

ชื่อโฮสต์ - ที่อยู่ IP ภายนอกหรือโดเมนของเซิร์ฟเวอร์ที่โฮสต์เว็บไซต์และฐานข้อมูล

ssh_user - ชื่อผู้ใช้สำหรับเชื่อมต่อผ่าน SSH ในกรณีส่วนใหญ่ คุณจะต้องรูทเพื่อดำเนินการทั้งหมด แม้ว่าคุณจะสามารถลองตั้งค่าให้กับผู้ใช้ที่ไม่มีสิทธิ์รายอื่นได้ก็ตาม

ssh_password!! - รหัสผ่านสำหรับผู้ใช้ข้างต้น

mysql_user * - ชื่อผู้ใช้สำหรับเชื่อมต่อกับฐานข้อมูลไซต์บนเซิร์ฟเวอร์ MySQL

mysql_password - รหัสผ่านสำหรับผู้ใช้ MySQL ข้างต้น จะต้องติดตั้ง!

mysql_db_name - ชื่อของฐานข้อมูลไซต์ที่เราจะทำการถ่ายโอนข้อมูลแบบเต็ม

dirs_to_backup ** - เขียนรายการพาธแบบเต็ม ไดเร็กทอรี และไฟล์ที่คั่นด้วยช่องว่างที่จำเป็นต้องเก็บถาวร

หมายเหตุ:

หากคุณปล่อยค่าว่างไว้ ระบบจะขอรหัสผ่านในภายหลัง โหมดโต้ตอบ(แนะนำว่าอย่าเก็บรหัสผ่าน)

* ถือว่าสคริปต์และฐานข้อมูล ข้อมูลมายเอสคิวแอลโฮสต์บนเซิร์ฟเวอร์เดียวกัน นั่นคือที่อยู่เซิร์ฟเวอร์ MySQL คือ 127.0.0.1 (localhost)

** ตามค่าเริ่มต้น ผู้จัดเก็บจะไม่แพ็คไฟล์ .htaccess ดังนั้นคุณต้องระบุเส้นทางแบบเต็มเพิ่มเติม!

** อย่าลืมระบุพาธแบบเต็มและไม่สัมพันธ์กับโฟลเดอร์หรือไฟล์

คุณสามารถสร้างไฟล์การกำหนดค่าได้มากเท่าที่คุณต้องการ เมื่อคุณเรียกใช้สคริปต์ ชื่อของแต่ละไฟล์จะแสดงพร้อมหมายเลขที่กำหนด ในการเริ่มทำงาน คุณต้องป้อนหมายเลขการกำหนดค่า (หมายเลข) เท่านี้ก็เรียบร้อย (หากคุณยังไม่มี) ไม่ได้ระบุรหัสผ่าน จากนั้นให้ป้อนรหัสผ่านอื่น)

การเตรียมงานและการใช้สคริปต์

มันง่ายมาก!

ขั้นตอนแรกคือการตัดสินใจว่าเราจะจัดเก็บสคริปต์พร้อมกับการกำหนดค่าทั้งหมดไว้ที่ใด แนะนำว่าอย่าเก็บนะครับ โปรแกรมที่คล้ายกันและข้อมูลบน เครื่องท้องถิ่นวี แบบฟอร์มเปิดเพราะมันไม่ปลอดภัยโดยเฉพาะถ้าใช้รหัสผ่าน การเข้าถึงรูทไปยังเซิร์ฟเวอร์ คอมเพล็กซ์สามารถเก็บไว้ที่ไหนสักแห่งบนสื่อที่เข้ารหัสหรือที่ไหนสักแห่งที่มีไวรัสหรือ คนแปลกหน้า- ในแง่ของความปลอดภัย ทางเลือกเป็นของคุณ เดินหน้าต่อไปกันดีกว่า

ปล่อยให้คอมเพล็กซ์ทั้งหมดตั้งอยู่ตามเส้นทาง:

  • D:\Backup\ - ไฟล์เก็บถาวรที่มีสำเนาสำรองจะถูกโหลดที่นี่
  • D:\Backup\script\ - สคริปต์และโปรแกรม WinSCP ของเราจะอยู่ที่นี่

1) ดาวน์โหลดโปรแกรม WinSCP เวอร์ชันที่กำหนดค่าและพกพาได้ล่าสุดจากเว็บไซต์ PortableApps - WinSCP Portable เราติดตั้งโปรแกรมในโฟลเดอร์ D:\Backup\script\ - โฟลเดอร์ WinSCPPortable จะถูกสร้างขึ้นที่นั่น และจะมีไฟล์ WinSCPPortable.exe อยู่ในนั้น

2) ดาวน์โหลดไฟล์เก็บถาวรด้วยสคริปต์และเทมเพลตที่นี่ - backup_sites_v1.2 และแตกไฟล์ลงในโฟลเดอร์ D:\Backup\script\

3) เปิดไฟล์ backup_sites_v1.2.bat เพื่อแก้ไขและแก้ไขเส้นทางในส่วน "การกำหนดค่า WinSCP":

  • "D:\Backup\script\WinSCPPortable\WinSCPPortable.exe" - พาธไปยังโปรแกรม WinSCP Portable
  • "D:\Backup\script\WinSCPPortable\Data\settings\winscp.log" - เส้นทางที่สร้างไฟล์บันทึกโปรแกรม WinSCP Portable

เราตรวจสอบให้แน่ใจว่าเส้นทางที่เขียนในสคริปต์สอดคล้องกับตำแหน่งของโปรแกรม WinSCP ไม่เช่นนั้นมันจะไม่เริ่มทำงาน

4) เราสร้างไฟล์เทมเพลตสำหรับการสำรองข้อมูลเว็บไซต์ ในไฟล์เก็บถาวรมีหลายรายการ - เปลี่ยนชื่อตามชื่อโดเมนของเว็บไซต์ของคุณและลบรายการที่ไม่จำเป็นออก

สร้าง เทมเพลตใหม่เว็บไซต์สำหรับสคริปต์ด้วยวิธีต่อไปนี้:

  1. เพียงคัดลอกไฟล์ INI แล้วเปลี่ยนชื่อเป็น ชื่อที่ถูกต้องจากนั้นเราจะแก้ไขการตั้งค่าในนั้น
  2. เราสร้างเทมเพลตโดยใช้สคริปต์ เรียกใช้สคริปต์ กด 2 แล้วป้อนชื่อโดเมนหรือชื่อเว็บไซต์ (เฉพาะอักขระละตินและสัญลักษณ์ _) Notepad จะเปิดขึ้นพร้อมกับไฟล์ที่สร้างขึ้นใหม่หลังจากนั้น มีการเปลี่ยนแปลงบันทึกและปิด

ตัวเลือกใดสะดวกกว่า - เลือกด้วยตัวคุณเอง

5) ทุกอย่างพร้อมแล้ว คุณสามารถเรียกใช้สคริปต์และลองสร้างสำเนาสำรองของไซต์ใดไซต์หนึ่งของคุณได้

หลังจากยืนยันการเลือกไซต์สำหรับการสำรองข้อมูลแล้ว ระบบอาจขอให้คุณป้อนรหัสผ่าน ผู้ใช้ SSHหากไม่ได้ระบุไว้ใน ไฟล์การกำหนดค่า- หน้าต่างจะเปิดขึ้นทันทีพร้อมบันทึกของโปรแกรม WinSCP ซึ่งจะแสดงความคืบหน้าของการดำเนินการบนเซิร์ฟเวอร์ตลอดจนความคืบหน้าในการดาวน์โหลดไฟล์เก็บถาวรที่เสร็จแล้วจากเซิร์ฟเวอร์

เมื่อ WinSCP ดาวน์โหลดไฟล์เก็บถาวรเสร็จสิ้น หน้าต่างจะปิดลง หากต้องการยุติสคริปต์ เพียงกดปุ่มใดก็ได้ในหน้าต่าง

เกี่ยวกับความปลอดภัยของข้อมูล

สคริปต์ระหว่างการดำเนินการสร้างขึ้น ไฟล์ชั่วคราว".tmp" พร้อมชุดคำสั่งสำหรับ WinSCP ไฟล์นี้ประกอบด้วยข้อมูลเข้าสู่ระบบและรหัสผ่านสำหรับการเข้าถึงเซิร์ฟเวอร์ผ่าน SSH

เทมเพลต INI พร้อมการตั้งค่าไซต์ยังมีข้อมูลที่สำคัญ - นี่คือพารามิเตอร์การเข้าถึงฐานข้อมูล

ฉันไม่แนะนำอย่างยิ่งให้เก็บสคริปต์และไฟล์การตั้งค่านี้ไว้ในดิสก์ที่สามารถเข้าถึงได้โดยตรงเมื่อใดก็ได้หลังจากเปิดตัวและจัดการง่ายๆ ด้วยคอมพิวเตอร์ สำหรับพื้นที่จัดเก็บข้อมูล คุณสามารถสร้างดิสก์ที่เข้ารหัสหรือซื้อสื่อแยกต่างหากได้

สคริปต์นี้เป็นเพียงเครื่องมือที่ช่วยประหยัดเวลาในการดำเนินการตามปกติและการกระทำที่คล้ายกัน ใช้เวลาและกังวลเกี่ยวกับความปลอดภัยและความปลอดภัยของข้อมูลของคุณ!

ความรับผิดชอบทั้งหมดในการใช้สคริปต์นี้ขึ้นอยู่กับคุณ โปรดใช้ความระมัดระวังเป็นอย่างยิ่ง!

บทสรุป

สคริปต์สามารถปรับและแก้ไขเพื่อให้สามารถทำงานได้มากขึ้นและดำเนินการตามที่คุณต้องการในไซต์ของคุณ

อีกด้วย วิธีนี้ระบบอัตโนมัติ WinSCP สามารถใช้เพื่อสร้างสคริปต์อื่น ๆ ที่จะดำเนินการได้ งานที่แตกต่างกันบน VPS หรือเซิร์ฟเวอร์เฉพาะของคุณผ่านทางคอนโซล

อัปเดต: 21/07/2017 เผยแพร่: 08/15/2016

สคริปต์นี้เขียนด้วย Unix Shell ที่ทำงานอยู่ ระบบปฏิบัติการ CentOS มันจะทำงานบนระบบส่วนใหญ่ ตระกูลลินุกซ์และบีเอสดี

สคริปต์ตัวอย่าง

สคริปต์จะสร้างดัมพ์ของตัวเองสำหรับแต่ละฐานข้อมูล นี่เป็นสิ่งจำเป็นสำหรับ ฟื้นตัวอย่างรวดเร็วข้อมูล.

  1. #!/bin/bash
  2. เส้นทาง=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
  3. ปลายทาง = "/ สำรอง / mysql"
  4. userDB = "สำรองข้อมูล"
  5. รหัสผ่านDB = "สำรอง"
  6. fdate=`วันที่ +%Y-%m-%d`
  7. ค้นหา $destination -type d \(-name "*-1[^5]" -o -name "*-?" \) -ctime +30 -exec rm -R () \; 2>&1
  8. ค้นหา $destination -type d -name "*-*" -ctime +180 -exec rm -R () \; 2>&1
  9. mkdir $ปลายทาง/$fdate 2>&1
  10. สำหรับ dbname ใน `echo show Databases | mysql -u$userDB -p$passwordDB | grep -v ฐานข้อมูล`; ทำ
  11. กรณี $dbname เข้ามา
  12. information_schema)
  13. ดำเนินการต่อ ;;
  14. mysql)
  15. ดำเนินการต่อ ;;
  16. ประสิทธิภาพ_สคีมา)
  17. ดำเนินการต่อ ;;
  18. ทดสอบ)
  19. ดำเนินการต่อ ;;
  20. *) mysqldump --ฐานข้อมูล --ข้ามความคิดเห็น -u$userDB -p$passwordDB $dbname | gzip > $destination/$fdate/$dbname.sql.gz ;;
  21. เสร็จแล้ว;

คำอธิบายสคริปต์

1 เราชี้ไปที่เส้นทางไปยังล่าม
2 เราตั้งค่าตัวแปรระบบเพื่อจะได้ไม่ต้องเขียนลงในสคริปต์ เส้นทางเต็มไปยังไฟล์ปฏิบัติการ
4 - 7 เราตั้งค่าตัวแปร
4 ไดเร็กทอรีที่เราจะบันทึกข้อมูลสำรอง
5 บัญชีสำหรับเชื่อมต่อกับฐานข้อมูล
6 รหัสผ่านสำหรับการเชื่อมต่อกับฐานข้อมูล
7 วันที่ที่สคริปต์ทำงาน
9 เราค้นหาข้อมูลสำรองทั้งหมดที่เก่ากว่า 30 วันแล้วจึงลบออก เราฝากไฟล์ไว้สำหรับการเก็บถาวรในวันที่ 15
10 เราลบข้อมูลสำรองทั้งหมดที่เก่ากว่า 180 วัน
11 เราสร้างไดเร็กทอรีที่เราจะบันทึกข้อมูลสำรอง ในฐานะชื่อไดเรกทอรี เราใช้วันที่เปิดตัวสคริปต์ในรูปแบบ YYYY-MM-DD
13 - 25 เราเชื่อมต่อกับฐานข้อมูลและดึงรายการฐานข้อมูลทั้งหมดออกมา เราทำสำเนาสำรองสำหรับแต่ละรายการ
15 - 22 เราข้ามฐานข้อมูลบริการ information_schema, mysql, performance_schema, test
23 เราทำสำเนาสำรองสำหรับฐานข้อมูล

การเตรียมระบบ

เชื่อมต่อกับฐานข้อมูลและสร้าง บัญชีด้วยสิทธิในการสร้าง สำเนาสำรอง:

> ให้สิทธิ์เลือก, แสดงมุมมอง, โหลดซ้ำ, ไคลเอ็นต์การจำลอง, กิจกรรม, ทริกเกอร์, ล็อคตารางบน *.* ไปที่ backup@localhost ที่ระบุโดย "สำรองข้อมูล";

* วี ในตัวอย่างนี้เราสร้างบัญชี การสำรองข้อมูลด้วยรหัสผ่าน การสำรองข้อมูล.

สร้างไดเร็กทอรีที่จะจัดเก็บข้อมูลสำรอง:

mkdir -p /สำรอง/mysql

บันทึกข้อมูลบนคอมพิวเตอร์ระยะไกล

การสำรองข้อมูลจะต้องถูกสร้างขึ้นบน คอมพิวเตอร์ระยะไกลหรือ ไดรฟ์ภายนอกเพื่อให้สามารถใช้งานได้หากเซิร์ฟเวอร์ล้มเหลว ตัวอย่างนี้ใช้ โฟลเดอร์ที่ใช้ร่วมกันบน เซิร์ฟเวอร์ระยะไกลซึ่งจะมีไฟล์สำรอง

เพื่อให้กระบวนการติดตั้งง่ายขึ้น โฟลเดอร์เครือข่ายให้เปิดไฟล์ต่อไปนี้เพื่อแก้ไข:

และเพิ่มบรรทัดต่อไปนี้เข้าไป:

//192.168.0.1/backup /mnt ผู้ใช้ cifs,rw,noauto,หนังสือรับรอง=/root/.smbclient 0 0

* ในตัวอย่างนี้ โฟลเดอร์ที่ใช้ร่วมกันจะถูกเมาท์ การสำรองข้อมูลบนเซิร์ฟเวอร์ที่มีที่อยู่ IP 192.168.0.1 ไปที่แค็ตตาล็อก /เดือน- เป็นเครือข่าย ระบบไฟล์ใช้แล้ว ซิฟ(โปรโตคอล SMB: เซิร์ฟเวอร์ samba หรือแชร์ โฟลเดอร์วินโดวส์- พารามิเตอร์การเชื่อมต่อ - ผู้ใช้: อนุญาตให้ผู้ใช้เมานต์มัน ร.ร: ด้วยสิทธิ์ในการอ่านและเขียน noauto: อย่าติดตั้งโดยอัตโนมัติเมื่อเริ่มต้นระบบ ข้อมูลรับรอง: ไฟล์ที่เขียนล็อกอินและรหัสผ่านสำหรับการเชื่อมต่อกับโฟลเดอร์แชร์

ตอนนี้เรามาสร้างไฟล์ด้วยการเข้าสู่ระบบและรหัสผ่าน:

# vi /root/.smbclient

และนำมาเป็นแบบฟอร์มดังนี้

ชื่อผู้ใช้=ข้อมูลสำรอง
รหัสผ่าน = สำรอง

* ชื่อผู้ใช้: ชื่อผู้ใช้, รหัสผ่าน: รหัสผ่าน. แน่นอน ในกรณีของคุณ ให้ระบุข้อมูลของคุณ

ตอนนี้ป้อนคำสั่งต่อไปนี้

สำรองข้อมูล ข้อมูลสำคัญ- ทั้งหมด ผู้ดูแลระบบเผชิญกับความท้าทายนี้ งานนี้ดูไม่สำคัญและจะไม่กระตุ้นความสนใจจากผู้อ่านจำนวนมาก แต่ตัวอย่างเช่นฉันต้องการบทความดังกล่าวมา ช่วงเวลาหนึ่งน่าจะช่วยได้มาก เลยคิดว่าควรมีบทความนี้ครับ

งาน: การสำรองข้อมูลไปยังไดเร็กทอรีท้องถิ่นและถึง เซิร์ฟเวอร์แยกต่างหากโดยใช้ซอฟต์แวร์บุคคลที่สามขั้นต่ำ บันทึกและแจ้งผู้ดูแลระบบใน Jabber ในกรณีที่เกิดข้อผิดพลาด ฟังก์ชั่นพื้นฐานทั้งหมดของซอฟต์แวร์สำรองข้อมูลอัตโนมัติส่วนใหญ่ แต่ไม่มีการติดตั้งดังนั้นจึงไม่มีข้อบกพร่อง (ซึ่งอันที่จริงแล้วนำไปสู่แนวคิดนี้)

ตอนนี้เรามาทำธุรกิจกันดีกว่า

ขั้นแรก เรามาสร้างและเปิดสคริปต์กันก่อน
สคริปต์สำรองนาโน
ตอนนี้เรามาเพิ่มบรรทัดให้กับสคริปต์
#!/bin/bash
มาประกาศตัวแปรกันหน่อย
TN - TASKNAME - ชื่องาน ใช้เพื่อส่งออกไปยังบันทึกและกำหนดชื่อไฟล์
เนื่องจากมีงานหลายอย่าง (รายเดือน รายสัปดาห์ รายวัน) และฉันขี้เกียจเกินไปที่จะเขียนสคริปต์สำหรับแต่ละกรณี ฉันจึงสร้างงานสากลขึ้นมาซึ่งคุณเพียงแค่ต้องไม่แสดงความคิดเห็น เส้นที่จำเป็น- ชื่อของงานจะต้องเขียนโดยไม่มีช่องว่าง โดยเฉพาะอย่างยิ่งเป็นภาษาละติน หากคุณไม่ต้องการมีปัญหากับการเข้ารหัสและพารามิเตอร์คำสั่งที่ไม่ถูกต้อง
TN=เอกสาร-รายเดือน
#TN=เอกสาร-รายสัปดาห์
#TN=docs-daily
OF - ไฟล์เอาต์พุต - ชื่อของไฟล์เอาต์พุต ได้มาจากตัวแปร TN นั่นคือชื่องาน
OF=$TN.tar.gz
เราประกาศตัวแปรด้วยเส้นทางไปยังไฟล์บันทึก จากนั้นข้อความแสดงข้อผิดพลาดและสิ่งอื่นๆ ทั้งหมดจะถูกส่งออกไปยังบันทึก
LOGFILE=/var/log/backup.log
มาสร้างรายการบันทึกเกี่ยวกับการเริ่มต้นการสำรองข้อมูล (วันที่ เวลา ชื่องาน)
เสียงสะท้อน >>$LOGFILE เสียงสะท้อน "=========================================== ============== ==========" >>$LOGFILE echo "$(วันที่ +"%d-%b-%Y %R")" > >$LOGFILE echo "งาน \"$TN\" ได้เริ่มต้นแล้ว .." >>$LOGFILE
มีปัญหาคือหากคุณระบุชื่อไดเร็กทอรีด้วยการเว้นวรรคในพารามิเตอร์คำสั่ง (เช่น tar) สคริปต์จะล้มเหลว พบวิธีแก้ไขบนอินเทอร์เน็ต - ห้องปฏิบัติการ ระบบลินุกซ์ใช้ช่องว่างเป็นตัวแยกพารามิเตอร์คำสั่งมาตรฐาน มากำหนดตัวคั่นมาตรฐานใหม่ (เก็บไว้ในตัวแปร $IFS) เป็นอย่างอื่นที่ไม่ใช่ช่องว่าง เช่น \n เป็นตัวขึ้นบรรทัดใหม่
จำค่าเก่าของตัวคั่นมาตรฐาน
OLD_IFS=$IFS
เปลี่ยนตัวคั่นมาตรฐานด้วยตัวคั่นของคุณเอง
ไอเอฟเอส=$"\n"
SRCD - SourRCe Directory - ไดเร็กทอรีพร้อมข้อมูลสำรอง
ตอนนี้คุณสามารถแสดงรายการหลายไดเร็กทอรีได้ โดยตัวคั่นจะเป็นตัวแบ่งบรรทัด ดังที่เราระบุไว้ในบรรทัดด้านบน
SRCD="/mnt/source/folder_1 /mnt/source/folder_2 /mnt/source/folder_N"
TGTD - TarGeT Directory - ไดเร็กทอรีที่จะจัดเก็บข้อมูลสำรอง
TGTD="/var/สำรอง/"
โดยปกติแล้ว เราเข้าใจดีว่าการจัดเก็บข้อมูลสำรองที่สำคัญเฉพาะที่ต้นทางนั้นอย่างน้อยก็ไม่สำคัญ ดังนั้นเราจะทิ้งสำเนาไว้ ทรัพยากรระยะไกลซึ่งเราจะเมานต์แยกกันโดยใช้ mount และ fstab ฉันจะอธิบายทันทีว่าทำไมฉันถึงใช้ mount และ fstab ไม่ใช่แค่ mount - ฉัน mount ไดเร็กทอรีนี้ในสคริปต์อื่น ๆ ของฉัน และอย่างที่เพื่อนโปรแกรมเมอร์คนหนึ่งของฉันพูด - โปรแกรมเมอร์ที่ดีจะไม่เขียนโค้ดเดิมซ้ำสองครั้ง (อย่างไรก็ตาม ฉันจำคำต่อคำไม่ได้ แต่ฉันหวังว่าฉันจะเข้าใจความหมาย)
TGTD2="/mnt/archive/"
กระบวนการจัดเก็บถาวรนั้นอยู่ในตัวเลือก "สร้าง" ที่เก็บถาวรใหม่"
tar -czf $TGTD$OF $SRCD &>>$LOGFILE
และในตัวเลือก "อัปเดตไฟล์ในไฟล์เก็บถาวรเก่า"
tar -u -f $TGTD$OF $SRCD &>>$LOGFILE
ในกรณีที่สอง ควรใช้ชื่อไฟล์เฉพาะแทน $OF เนื่องจาก ตัวอย่างเช่น ไฟล์เก็บถาวรรายสัปดาห์ของฉันได้รับการอัปเดตทุกวัน และ $TN (ชื่องาน) ไม่ตรงกัน ดังนั้น $OF

ในตัวแปร "?" สถานะการดำเนินการของคำสั่งสุดท้ายถูกทำลาย เอาไว้ใช้ทีหลังครับ
สถานะ=$?
ส่งกลับตัวคั่นมาตรฐานไปที่ มูลค่าเดิม
ไอเอฟเอส=$OLD_IFS
ตอนนี้เรามาเพิ่มเงื่อนไข - หากกระบวนการบรรจุเข้า ไฟล์เก็บถาวร tarจบลงด้วยข้อผิดพลาด ส่งข้อความถึงผู้ดูแลระบบ ลบ ไฟล์ล้มเหลวการสำรองข้อมูล มิฉะนั้นเราจะดำเนินการต่อไป - เราติดตั้งการแชร์เครือข่ายและโยนสำเนาของไฟล์เก็บถาวรลงไป หลังจากการดำเนินการแต่ละครั้ง เราจะตรวจสอบผลลัพธ์ของการดำเนินการ เขียนบันทึก และดำเนินการต่อหรือแจ้งให้ผู้ดูแลระบบทราบ และขัดจังหวะขั้นตอน
ถ้า [[ $STATUS != 0 ]]; จากนั้น rm $TGTD$OF &>>$LOGFILE echo "#################################### ######" >>$LOGFILE echo ### เกิดข้อผิดพลาด! การสำรองข้อมูลล้มเหลว ###" >>$LOGFILE echo ################ # ###########################" >>$LOGFILE echo "$(วันที่ +"%d-%b-%Y %R% nFile ") ไม่ได้สร้างการสำรองข้อมูล $OF" | sendxmpp -t -f /usr/local/etc/XMPP_settings allowance_login@domain &>>$LOGFILE else echo "ไฟล์สำรองที่บันทึกเป็น \"$TGTD$OF\"" >>$LOGFILE echo "การสำรองข้อมูลเสร็จสมบูรณ์เมื่อ $(วันที่ +"%R %d-%b-%Y")!" >>$LOGFILE echo "การติดตั้งระบบไฟล์สำหรับไฟล์เก็บถาวรสำรอง $TGTD_archive" >>$LOGFILE mount $TGTD2 &>>$LOGFILE ถ้า [[ $? != 0 ]]; แล้วก็ก้อง ############################################### ##############" >>$LOGFILE echo ### เกิดข้อผิดพลาดขณะติดตั้งทรัพยากรสำรอง ###" >>$LOGFILE echo ######## ## ################################################# ## #" >>$LOGFILE echo "$(date +"%d-%b-%Y %R%nFile") ของข้อมูลสำรอง $OF ไม่ได้ถูกคัดลอกไปยังทรัพยากรสำรอง" | sendxmpp -t -f /usr/local/etc/XMPP_settings allowance_login@domain &>>$LOGFILE exit fi echo "การคัดลอกไฟล์ไปยังทรัพยากรสำรองเริ่มต้นแล้ว" >>$LOGFILE cp -f $TGTD$OF $TGTD_archive$OF &>> $LOGFILE ถ้า [[ $? != 0 ]]; แล้วก็ก้อง ############################################### ##############" >>$LOGFILE echo ### เกิดข้อผิดพลาดขณะคัดลอกไปยังทรัพยากรสำรอง ###" >>$LOGFILE echo ####### ## ################################################# ## ##" >>$LOGFILE echo "$(date +"%d-%b-%Y %R%nFile") ของข้อมูลสำรอง $OF ไม่ได้คัดลอกไปยังทรัพยากรสำรอง" | sendxmpp -t -f /usr/local/etc/XMPP_settingsผู้รับ_login@domain &>>$LOGFILE else echo "การคัดลอกไฟล์เสร็จสมบูรณ์เมื่อ $(date +"%R %d-%b-%Y")!" >>$LOGFILE echo "ไฟล์ที่คัดลอกเป็น \"$TGTD_archive$OF\"" >>$LOGFILE fi echo "การถอนการเชื่อมต่อระบบไฟล์สำหรับไฟล์เก็บถาวรสำรอง $TGTD_archive" >>$LOGFILE umount $TGTD2 &>>$LOGFILE echo " การดำเนินการทั้งหมดเสร็จสมบูรณ์ด้วยความสำเร็จ!" >>$LOGFILE ออกจากระบบ

ในกระบวนการนี้ เราจะคัดลอกไฟล์เก็บถาวรจากที่จัดเก็บในเครื่องไปยังที่เก็บข้อมูลระยะไกล โดยปกติแล้ว เราจะตรวจสอบว่าการดำเนินการแต่ละอย่างเสร็จสมบูรณ์และเขียนทุกอย่างลงในบันทึก
ในการส่งข้อความถึงผู้ดูแลระบบ ฉันใช้ข้อความ XMPP เนื่องจากองค์กรมีเซิร์ฟเวอร์ Jabber และฉันต้องการรับ ข้อความด่วนเกี่ยวกับความล้มเหลว แทนที่จะเข้าไปในอีเมลของฉัน พิมพ์รหัสผ่าน คลิกลิงก์ และรอให้เบราว์เซอร์แสดงทุกอย่างให้ฉัน ไม่ว่าในกรณีใด จะไม่มีใครหยุดคุณไม่ให้ใช้ sendmail แทน sendxmpp
ไฟล์ /usr/local/etc/XMPP_settings มีดังต่อไปนี้:

#sender_login@domain;jabber_server_IP:jabber_server_port sender_password login@domen;127.0.0.1:5222 รหัสผ่าน
ใน ไฟล์ fstabสตริงที่อธิบายการเชื่อมต่อกับ Windows ที่ใช้ร่วมกัน
//192.168.0.250/arhiv /mnt/archive cifs noauto,rw,iocharset=utf8,cp866,file_mod=0666,dir_mod=0777,noexec,_netdev,หนังสือรับรอง=/root/.passwd_to_archive_directory 0 0
ตอนนี้สิ่งที่เหลืออยู่คือการเพิ่มงานให้กับ cron ซึ่งสามารถทำได้โดยใช้ไฟล์ /etc/crontab แต่เนื่องจากพฤติกรรม GUI ของฉันที่สืบทอดมาจาก Windows ฉันจึงใช้เว็บอินเตอร์เฟสสำหรับกรณีดังกล่าว คำสั่งจะต้องดำเนินการด้วยสิทธิ์รูท เช่น sudo bash backup_script ด้วยการเพิ่มคำสั่งลงใน cron คุณสามารถระบุได้ว่าคำสั่งนั้นจะถูกดำเนินการทันทีในฐานะรูท

ในระหว่างการอภิปราย ปัญหาการเติบโตของบันทึกได้ถูกหยิบยกขึ้นมา ฉันทำตามเส้นทางที่ง่ายที่สุด (ในความคิดของฉัน): เราจะจัดเก็บเฉพาะ N บรรทัดสุดท้ายของบันทึก เช่น 300 บรรทัดสองบรรทัดจะถูกเพิ่มลงในสคริปต์ ซึ่งเราจะบันทึก 300 บรรทัดสุดท้ายของบันทึกลงใน ไฟล์ชั่วคราว จากนั้นเราจะลบบันทึกด้วย
หาง -n 300 $LOGFILE >/tmp/unique_fantastic_filename.tmp mv -f /tmp/unique_fantastic_filename.tmp $LOGFILE
ฉันจะพาคุณไป ข้อความฉบับเต็มสคริปต์:
#!/bin/bash TN=docs-monthly #TN=docs-weekly #TN=docs-daily OF=$TN.tar.gz LOGFILE=/var/log/backup.log echo >>$LOGFILE echo "== ================================================== === =" >>$LOGFILE echo "$(date +"%d-%b-%Y %R")" >>$LOGFILE echo "งาน \"$TN\" เริ่มต้นแล้ว..." >>$ LOGFILE OLD_IFS= $IFS IFS=$"\n" SRCD="/mnt/source/folder_1 /mnt/source/folder_2 /mnt/source/folder_N" TGTD="/var/backups/" TGTD2="/mnt/archive /" tar -czf $TGTD$OF $SRCD &>>$LOGFILE #tar -u -f $TGTD$OF $SRCD &>>$LOGFILE สถานะ=$? IFS=$OLD_IFS ถ้า [[ $STATUS != 0 ]]; จากนั้น rm $TGTD$OF &>>$LOGFILE echo "#################################### ######" >>$LOGFILE echo ### เกิดข้อผิดพลาด! การสำรองข้อมูลล้มเหลว ###" >>$LOGFILE echo ################ # ###########################" >>$LOGFILE echo "$(วันที่ +"%d-%b-%Y %R% nFile ") ไม่ได้สร้างการสำรองข้อมูล $OF" | sendxmpp -t -f /usr/local/etc/XMPP_settings allowance_login@domain &>>$LOGFILE else echo "ไฟล์สำรองที่บันทึกเป็น \"$TGTD$OF\"" >>$LOGFILE echo "การสำรองข้อมูลเสร็จสมบูรณ์เมื่อ $(วันที่ +"%R %d-%b-%Y")!" >>$LOGFILE echo "การติดตั้งระบบไฟล์สำหรับไฟล์เก็บถาวรสำรอง $TGTD_archive" >>$LOGFILE mount $TGTD2 &>>$LOGFILE ถ้า [[ $? != 0 ]]; แล้วก็ก้อง ############################################### ##############" >>$LOGFILE echo ### เกิดข้อผิดพลาดขณะติดตั้งทรัพยากรสำรอง ###" >>$LOGFILE echo ######## ## ################################################# ## #" >>$LOGFILE echo "$(date +"%d-%b-%Y %R%nFile") ของข้อมูลสำรอง $OF ไม่ได้ถูกคัดลอกไปยังทรัพยากรสำรอง" | sendxmpp -t -f /usr/local/etc/XMPP_settings allowance_login@domain &>>$LOGFILE exit fi echo "การคัดลอกไฟล์ไปยังทรัพยากรสำรองเริ่มต้นแล้ว" >>$LOGFILE cp -f $TGTD$OF $TGTD_archive$OF &>> $LOGFILE ถ้า [[ $? != 0 ]]; แล้วก็ก้อง ############################################### ##############" >>$LOGFILE echo ### เกิดข้อผิดพลาดขณะคัดลอกไปยังทรัพยากรสำรอง ###" >>$LOGFILE echo ####### ## ################################################# ## ##" >>$LOGFILE echo "$(date +"%d-%b-%Y %R%nFile") ของข้อมูลสำรอง $OF ไม่ได้คัดลอกไปยังทรัพยากรสำรอง" | sendxmpp -t -f /usr/local/etc/XMPP_settingsผู้รับ_login@domain &>>$LOGFILE else echo "การคัดลอกไฟล์เสร็จสมบูรณ์เมื่อ $(date +"%R %d-%b-%Y")!" >>$LOGFILE echo "ไฟล์ที่คัดลอกเป็น \"$TGTD_archive$OF\"" >>$LOGFILE fi echo "การถอนการเชื่อมต่อระบบไฟล์สำหรับไฟล์เก็บถาวรสำรอง $TGTD_archive" >>$LOGFILE umount $TGTD2 &>>$LOGFILE echo " การดำเนินการทั้งหมดเสร็จสมบูรณ์ด้วยความสำเร็จ!" >>$LOGFILE fi tail -n 300 $LOGFILE >/tmp/unique_fantastic_filename.tmp mv -f /tmp/unique_fantastic_filename.tmp $LOGFILE ออก

ขอขอบคุณทุกท่านที่ให้ความสนใจ!

การสำรองข้อมูลควรเป็นแบบที่คุณสามารถเปลี่ยนโฮสต์ได้ตลอดเวลาและย้ายไปที่ เซิร์ฟเวอร์ใหม่- ดังนั้นกระบวนการทั้งหมดในการสร้างไฟล์เก็บถาวรจะต้องเป็นไปโดยอัตโนมัติ และไฟล์สำรองควรเก็บไว้ในที่ปลอดภัยและเข้าถึงได้ตลอด 24 ชั่วโมงจากทุกที่ในโลก

ฉันกำลังเผยแพร่โซลูชันอื่นสำหรับการสำรองข้อมูลเว็บเซิร์ฟเวอร์ สคริปต์ทุบตีนี้สร้างไฟล์เก็บถาวรฐานข้อมูลและไฟล์ไซต์ทั้งหมดเพียงไฟล์เดียว เพื่อความสะดวก ข้อมูลสำรองล่าสุด 30 รายการจะถูกจัดเก็บไว้ในดิสก์ และเพื่อความน่าเชื่อถือ จึงมีการโพสต์ไฟล์สำรองข้อมูลไว้ ที่เก็บข้อมูลบนคลาวด์ Yandex.Disk
มีวิธีแก้ไขปัญหาที่คล้ายกันมากมายบนอินเทอร์เน็ต แต่สคริปต์นี้สะท้อนถึงวิสัยทัศน์ของฉันในการสำรองข้อมูลเว็บเซิร์ฟเวอร์ได้อย่างเต็มที่

หลักการพื้นฐานของการสำรองข้อมูล

เราสร้างไฟล์เก็บถาวรโดยใช้เครื่องมือระบบปฏิบัติการในตัวเพื่ออำนวยความสะดวกในกระบวนการสร้างไฟล์เก็บถาวรและเร่งการคืนค่าไซต์บนเซิร์ฟเวอร์ใหม่หากจำเป็น
เราใช้รูปแบบไฟล์เก็บถาวรที่ช่วยให้คุณสามารถบันทึกคุณลักษณะทั้งหมดของไฟล์และโฟลเดอร์ได้ ที่จะได้รับ สำเนาถูกต้องไซต์ในตำแหน่งใหม่
เราแยกเก็บถาวรและบีบอัดฐานข้อมูลและไดเร็กทอรีเว็บเซิร์ฟเวอร์ด้วยไฟล์ทั้งหมด จากนั้นเราจะรวมมันไว้ในไฟล์เก็บถาวรเดียวโดยไม่มีการบีบอัด เพื่อความสะดวก เราสร้างชื่อไฟล์เก็บถาวรตามชื่อโดเมนและวันที่สร้าง
มาจัดกัน ที่เก็บข้อมูลในเครื่องจากสำเนาเอกสารสำคัญล่าสุด 30 ชุด เพื่อให้สามารถ”ย้อนกลับ”เว็บไซต์ได้ สถานะก่อนหน้าในกรณี สถานการณ์ที่ไม่คาดฝัน- เช่น เมื่อติดไวรัส หรือ การอัปเดตล้มเหลวซีเอ็มเอส.
เราจัดระเบียบพื้นที่จัดเก็บข้อมูลสำรองอิสระในที่เก็บข้อมูลบนคลาวด์ Yandex.Disk และอัปโหลดไฟล์เก็บถาวรของเราที่นั่น

สคริปต์ BASH สำหรับการสำรองไฟล์ไซต์และฐานข้อมูล MySQL

#!/bin/bash # #ver 1.0 #2013-09-09 # # ตัวแปรฐานข้อมูล DBHOST = "localhost" #Address เซิร์ฟเวอร์ MySQL DBUSER="bd_user" #ชื่อผู้ใช้ฐานข้อมูล DBPASS="dBpAsS" #รหัสผ่านผู้ใช้ฐานข้อมูล DBNAME="db_name" #ชื่อฐานข้อมูล DBARC=$DBNAME.sql.gz #ชื่อไฟล์เก็บถาวรฐานข้อมูล # #ตัวแปร WEBDAV WEBDAVURL="https://webdav .yandex.ru/backup/" #Yandex.Disk ที่อยู่ โฟลเดอร์นี้ต้องมีอยู่! เว็บดาวูเซอร์=" [ป้องกันอีเมล]" #ชื่อผู้ใช้จาก Yandex.Disk (Yandex.Mail) WEBDAVPASS="MyPasWordAtYandexMail" #รหัสผ่านจาก Yandex.Disk # #ตัวแปรไซต์ SCRIPTDIR="/home/serveruser/backup/" #เส้นทางสัมบูรณ์จากตำแหน่งที่เรียกใช้สคริปต์และตำแหน่ง SCRDIR ไฟล์เก็บถาวรจะถูกจัดเก็บ ="/home/serveruser/web/mydomain.com/public_html/" #เส้นทางที่แน่นอนไปยังไซต์จากรากของดิสก์ SCREXCLUDE="webstat" #สิ่งที่จะไม่รวมอยู่ในไฟล์เก็บถาวร SCRARC="public_html. tar.gz" #ชื่อของไฟล์เก็บถาวรของไฟล์ไซต์ # #ตัวแปรสำรอง ARCNAME="mydomain.com"=$(date "+%F(%H:%M)")".tar" #ชื่อของการสำรองข้อมูลไซต์ ARCMAX="30" #จำนวนไฟล์ในที่จัดเก็บในตัวเครื่อง # # ไปกันเลย ไดเรกทอรีรากเว็บเซิร์ฟเวอร์ซีดี $SCRDIR # #สร้าง เก็บไฟล์ด้วยการบีบอัด ให้คำนึงถึงข้อยกเว้น tar cfz $SCRIPTDIR$SCRARC --exclude=$SCREXCLUDE * # ##กลับไปที่โฟลเดอร์ที่มีสคริปต์ ซึ่งไฟล์เก็บถาวรทั้งหมดอยู่ cd $SCRIPTDIR # #เก็บถาวรฐานข้อมูลด้วยการบีบอัด mysqldump -h$DBHOST -u$DBUSER - p$DBPASS $DBNAME | gzip > $DBARC # #รวมไฟล์เก็บถาวรและดัมพ์ฐานข้อมูล ตอนนี้โดยไม่ต้องบีบอัด tar cf $SCRIPTDIR$ARCNAME $SCRARC $DBARC # #ส่งผลลัพธ์ไปที่ Yandex.Disk curl --user $WEBDAVUSER:$WEBDAVPASS -T $ARCNAME $ WEBDAVURL # #ลบไฟล์เก็บถาวรระดับกลาง rm *.gz # #ลบสำเนาเก่าของไซต์ เหลือสำเนาใหม่หลายชุด ls -t *.tar | หาง -n+$ARCMAX | xargs rm -f

ตอนนี้เรามาดูสคริปต์ทีละส่วน ทุกอย่างชัดเจนด้วยตัวแปรที่ระบุไว้ตอนต้นของสคริปต์ ฉันพยายามแยกแมลงวันออกจากชิ้นเนื้อให้มากที่สุดและแสดงความคิดเห็นเกี่ยวกับทุกสิ่งที่จำเป็น
มาดูส่วนที่ปฏิบัติการได้ของสคริปต์กันดีกว่า

วิธีสร้างไฟล์เก็บถาวรของไฟล์ไซต์

ตามกฎแล้วไม่มีปัญหาในการสร้างไฟล์เก็บถาวร สิ่งสำคัญคืออย่าสับสนกับสัมบูรณ์และ เส้นทางสัมพัทธ์- เพื่อให้แน่ใจว่าคุณเก็บถาวรสิ่งใดและเก็บถาวรไว้ที่ใด
เพื่อหลีกเลี่ยงความสมบูรณ์ เส้นทางที่แน่นอนในไฟล์เก็บถาวร ขั้นแรกให้ไปที่ไดเร็กทอรีรากของไซต์

ฉันไม่ชอบแบบนั้น คุณเปิดไฟล์เก็บถาวรแล้วมีโฟลเดอร์ บ้านคุณเข้าไปแล้วก็มีอีกอัน คุณเข้าไป ตามด้วยอันถัดไป และสรุปสั้นๆ ก็คือตุ๊กตาทำรัง คุณจะหมดแรงในการพยายามเข้าถึงเนื้อหา
ดังนั้น ก่อนที่จะสร้างไฟล์เก็บถาวร ให้รันคำสั่งก่อน:

ซีดี$SCRDIR

จากนั้นไฟล์เก็บถาวรจะมีเนื้อหาของไดเร็กทอรีรากของไซต์ทันทีโดยไม่มีโฟลเดอร์และโฟลเดอร์ย่อย บางสิ่งเช่นนี้:


หากคุณมีไฟล์ที่ไม่จำเป็นต้องอยู่ในการสำรองข้อมูลไซต์ สำหรับฉันนี่คือโฟลเดอร์ เว็บสแตทจากนั้นคุณจะต้องกำหนดค่าพารามิเตอร์ --exclude

เรียนรู้เพิ่มเติมเกี่ยวกับตัวเลือกทั้งหมด ทาร์คุณสามารถอ่านได้ในคู่มืออย่างเป็นทางการ

วิธีสำรองฐานข้อมูล MySQL

ในการรับดัมพ์ฐานข้อมูล เราจำเป็นต้องมีพารามิเตอร์การเข้าถึง ทั้งหมดมีการอธิบายไว้ในตัวแปรสคริปต์และไม่ควรทำให้เกิดปัญหาใดๆ หากต้องการลดขนาดไฟล์ ให้บีบอัดเอาต์พุตของยูทิลิตี้ mysqldump- ฉันใช้ gzipซึ่งมีอยู่ในค่าดีฟอลต์ใน *NIX
ถ้าใช้ของเก่า เวอร์ชัน MySQLเซิร์ฟเวอร์สูงสุด 4.1 จากนั้นบนฐานข้อมูลขนาดใหญ่ พารามิเตอร์อาจมีประโยชน์ --เร็ว- การใช้งานซึ่งบอกคำสั่ง mysqldumpเขียนดัมพ์ฐานข้อมูลลงดิสก์ทันที แทนที่จะแคชไว้ในหน่วยความจำ มากขึ้น เวอร์ชันล่าสุดตัวเลือกนี้เปิดใช้งานตามค่าเริ่มต้น

ไฟล์สำรองข้อมูลไซต์เดียว

เพื่อให้โซลูชันมีความสวยงาม ลองรวมไฟล์เก็บถาวรสองไฟล์ของไซต์และดัมพ์ฐานข้อมูลไว้ในไฟล์เก็บถาวรเดียว ตอนนี้ไม่มีการบีบอัดเนื่องจากก่อนหน้านี้เราผ่านแต่ละอันไปแล้ว gzip.
เพื่อความสะดวก ชื่อไฟล์จะประกอบด้วยชื่อโดเมนที่ใช้และเวลาที่สร้าง

วิธีบันทึกสำเนาสำรองของเว็บไซต์ใน Yandex.Disk

Yandex.Disk ไม่จำเป็นต้องทำหน้าที่เป็นที่เก็บข้อมูลบนคลาวด์ คุณสามารถใช้ Microsoft SkyDrive หรือบริการอื่นใดที่ใช้โปรโตคอล WebDAV ในการเข้าถึงได้

วิธีลบสำเนาไฟล์เก่าโดยยังคงเก็บสำเนาไฟล์ล่าสุดไว้

ในตอนท้ายของสคริปต์เราจะลบออก ไฟล์ที่ไม่จำเป็นซึ่งเป็นไฟล์เก็บถาวรและฐานข้อมูล และเราจะจำกัดจำนวน สำเนาเอกสารสำคัญเว็บไซต์.
เราจะค้นหาสำเนาสำรองที่ล้าสมัย และลบออก หากมี รหัสต่อไปนี้รับผิดชอบสิ่งนี้:

Ls -t *.tar | หาง -n+$MAXARC | xargs rm -f

มันทำงานอย่างไร? ตามคำสั่ง LSค้นหาไฟล์เก็บถาวร (ไฟล์ที่มีนามสกุล ทาร์) เอาต์พุตจะถูกสร้างขึ้นตามเวลาที่สร้างไฟล์ คำสั่งถัดไป หางกรองรายการโดยตัด 30 รายการแรกออก และที่เหลือก็โอนเข้าทีม RMสำหรับการลบ พารามิเตอร์ มันทำหน้าที่เพื่อ "ความเงียบ" หากไม่มีสิ่งใดให้ลบ สิ่งนี้จะเกิดขึ้นเมื่อคุณเพิ่งเริ่มรวบรวมการสำรองข้อมูลและจำนวนการสำรองข้อมูลนั้นไม่เกินค่าของตัวแปร $MAXARC.
ตามจริงแล้ว หลังจากดำเนินการคำสั่งนี้แล้ว จะมีสำเนาสำรองเพียง 29 ชุดเท่านั้นที่ยังคง "ใช้งานได้"

เรียกใช้สคริปต์สำรองข้อมูล

เราบันทึกสคริปต์เป็นต้น สำรอง.sh- และเรากำหนดสิทธิ์ในการดำเนินการให้กับมัน:

#chmod +x การสำรองข้อมูล sh

วิธีที่สะดวกที่สุดคือการใช้ CRON เพื่อรันสคริปต์ตามกำหนดเวลา ฉันสร้างการสำรองข้อมูลวันละครั้งในช่วงนอกเวลาเร่งด่วน นั่นคือในช่วงครึ่งหลังของคืนในตอนเช้า
อย่าลืมเกี่ยวกับเจ้าของโฟลเดอร์และไฟล์เมื่อเราเรียกใช้สคริปต์เพื่อดำเนินการ ท้ายที่สุดแล้ว ไฟล์ของผู้ใช้ VASYA จะไม่สามารถเข้าถึงได้หากคุณเรียกใช้สคริปต์ในฐานะผู้ใช้ PETYA

ผลลัพธ์ของสคริปต์สำรอง


ทุกวันเวลา 6.00 น. สำเนาสำรองของไซต์จะถูกสร้างขึ้นบนเซิร์ฟเวอร์ (ไฟล์และฐานข้อมูล) และส่งไปยังที่เก็บข้อมูลบนคลาวด์ Yandex.Disk
เมื่อเขียนบทความนี้ เซิร์ฟเวอร์จริงที่บล็อกนี้ใช้งานทำหน้าที่เป็นไซต์ทดสอบ เซิร์ฟเวอร์ใช้ CentOS 6.4 พร้อมการอัปเดตทั้งหมด ณ ต้นเดือนกันยายน 2556
ยินดีรับฟังความคิดเห็นและข้อเสนอแนะเกี่ยวกับวิธีการทำงานของสคริปต์ มีแผนจะใช้การจำกัดจำนวนสำเนาสำรองไม่เพียงแต่บนเซิร์ฟเวอร์ แต่ยังอยู่ในคลาวด์ Yandex.Disk ด้วย ในระหว่างนี้ จะต้องล้างไฟล์เก็บถาวรที่สะสมเมื่อเวลาผ่านไปด้วยตนเอง