Skrip sandaran. Mengenai keselamatan data. Bagaimana untuk mengalih keluar salinan fail lama sambil mengekalkan beberapa yang terakhir

cara Salinan simpanan Terdapat banyak, tetapi bagi saya secara peribadi mereka mempunyai kelemahan mereka, itulah sebabnya saya tidak menggunakannya. Lebih mudah untuk menulis beberapa skrip mudah, contohnya, menggunakan apa yang dipanggil nama samaran kelawar atau PowerShell. Dalam artikel ini saya akan memberitahu anda bagaimana anda boleh menyediakan sandaran menggunakan skrip, saya menggabungkannya dan membuat berkas.

Skim sandaran

Dalam kebanyakan kes, sandaran datang untuk menyimpan fail tertentu. Ia boleh menjadi imej mesin maya, fail pengguna, sandaran pangkalan data SQL, memunggah pangkalan maklumat 1C:Enterprise, dsb. Adalah lebih tepat untuk menyimpan semua salinan sandaran fail ini di lokasi lain, ini boleh menjadi folder rangkaian, pemacu luaran, pemacu pita, ftp, dsb. Untuk kemudahan, saya menggunakan pelayan ftp.

Mari lihat rajah bagaimana ini semua berlaku:

  1. Salin atau alihkannya ke folder untuk dihantar ke arkib
  2. Semak folder untuk sandaran baharu
  3. Kami menghantar fail ke arkib pada pelayan FTP
  4. Memadamkan fail sandaran lama

Pada langkah pertama, kami mencipta fail yang perlu kami salin ke pelayan FTP kami. Sekarang kita perlu menyalinnya ke folder, yang seterusnya kita akan hantar ke FTP. Untuk melakukan ini, anda boleh menggunakan arahan mudah:

Salin "PATH_TO_SOURCE_FOLDER\* C:\Backup\

Dengan menjalankan arahan ini, semua fail kami akan disalin ke C:\Backup\. penuhi perintah ini masuk akal jika anda mengumpul daripada tempat berbeza Sandaran anda. Kini kami memerlukan skrip yang akan menyemak folder untuk fail baharu dan menghantarnya ke pelayan FTP. Cipta fail kosong backup.ps1 dan tulis skrip berikut ke dalamnya.

$a = (Get-Host).UI.RawUI $a.WindowTitle = "Segerakkan Folder Ke 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" !}

Mari kita fikirkan bagaimana ia berfungsi skrip ini. Pertama, pembolehubah ditetapkan yang menunjukkan pelayan, nama pengguna, kata laluan dan folder sumber. Kemudian dalam baris $Files = Get-ChildItem $localDirectory | Di mana ($_.LastWriteTime -gt (Get-Date).AddDays(-1)) memilih semua fail yang tarikh pengubahsuaiannya lebih besar (-qt) daripada tarikh semasa tolak 1 hari. Di sini anda boleh melaraskannya mengikut jadual anda. Saya membuat sandaran setiap hari. Kemudian dalam satu gelung kami pergi melalui setiap fail yang memenuhi syarat dan menghantarnya ke pelayan FTP.

Untuk tidak mengambil ruang cakera, saya memadamkan sandaran yang lebih lama daripada 30 hari. Pada dasarnya, selepas menghantarnya ke FTP, anda boleh memadamkannya dengan serta-merta, saya meninggalkannya hanya supaya jika tiba-tiba diperlukan, saya tidak perlu membuang masa memuat turunnya dari FTP, dan salinan tambahan sandaran tidak akan menyakitkan, anda tidak pernah tahu apa yang mungkin berlaku dengan FTP. Jadi jika ruang anda membenarkannya, saya cadangkan menyimpannya pada pelayan asal.

Untuk membersihkan folder saya menggunakan skrip removeOldBackups.ps1

$fullTargetPath = "C:\Backup" $deleteFiles = Get-Childitem $fullTargetPath -Recurse | Di mana ($_.LastWriteTime -lt (Get-Date).AddDays(-30)) | Foreach ( Remove-Item $_.FullName -Force -Recurse)

Skrip yang sangat mudah, saya akan menerangkan hanya satu perkara rentetan Di mana($_.LastWriteTime -lt (Get-Date).AddDays(-30)) | baris ini membandingkan tarikh pengubahsuaian fail dengan tarikh semasa tolak 30 hari; perbandingan ini akan termasuk fail yang LastWriteTimenya kurang tarikh semasa tolak 30 hari. Jika perlu, anda boleh menyesuaikannya mengikut keperluan anda.

Mukadimah

Idea untuk mencipta skrip yang boleh membuat salinan sandaran tapak (semua fail + longgokan pangkalan data) dalam beberapa klik muncul semasa saya sedang mengerjakan beberapa projek, dan sedang membangun dan menguji di pelayan web tempatan. Walaupun begitu, saya mempunyai Denver, yang dari masa ke masa telah digantikan oleh gabungan perkhidmatan web tempatan yang lebih pesat membangun - OpenServer.

Projek-projek telah dilawati, jadi mula-mula salinan tempatan keseluruhan tapak dibuat, dan hanya selepas itu adalah mungkin untuk bekerja dan bereksperimen dengannya, mengelakkan gangguan dalam kerja projek langsung. Saya membuat sandaran seperti ini: Saya log masuk melalui SSH dan membungkus folder projek dengan arkib 7Zip atau TGZ, membuat pembuangan menggunakan mysqldump dan memuat turun semua perkara ini melalui web atau SCP/WinSCP.

Dengan serta-merta kemalasan terasa dan timbul pemikiran tentang automasi: "Alangkah baiknya jika semua yang saya taip ke dalam konsol dilakukan secara automatik untuk setiap tapak, dan hanya beberapa klik diperlukan daripada saya." Carian pertama saya untuk penyelesaian automasi SSH untuk Windows serta-merta membawa saya ke utiliti yang telah lama saya gunakan untuk bekerja dengan fail pada pelayan - .

Cara skrip sandaran berfungsi

Jadi, intipati skrip sandaran automatik adalah seperti berikut:

  1. Kami membaca data dari fail ini, di mana kami menyimpan tetapan untuk tapak (nama, log masuk, kata laluan, akaun mysql...);
  2. Berdasarkan data, kami menjana skrip untuk WinSCP, yang akan melaksanakan semua operasi yang diperlukan dalam konsol pada pelayan;
  3. Kami melancarkan program WinSCP, yang log masuk ke pelayan dan membuat salinan sandaran tapak + pangkalan data, dan juga mengarkibkan semua data menggunakan arkib dengan darjat tinggi mampatan - 7Zip atau TAR+GZip;
  4. Muat turun arkib;
  5. Tutup WinSCP dan kosongkan log + padamkan skrip yang dijana sementara untuk WinSCP dengan arahan;
  6. sedia! Perlukan salinan tapak lain? - GOTO 1!

Mungkin tidak ada satu, tetapi beberapa tapak, jadi adalah mungkin untuk menggunakan banyak fail ini dengannya tetapan berasingan untuk setiap tapak.

Semua operasi pemprosesan dan pengurusan WinSCP akan dilakukan oleh skrip. ditulis dalam bahasa skrip fail kelawar untuk Windows. Ia juga menyediakan antara muka konsol ringkas yang membolehkan anda melakukan semua operasi yang diperlukan.

Untuk tugas ini, berdasarkan kesederhanaannya, bahasa skrip fail kelawar cukup mencukupi, tetapi masih tiada siapa yang mengganggu untuk melaksanakan sistem ini dalam Autoit atau dalam salah satu bahasa pengaturcaraan tahap tinggi, seperti C#, Delphi, dsb.

Perhatian! Skrip hanya relevan jika anda mempunyai akses kepada konsol pelayan melalui SSH.

Antara muka sandaran dan menu

Selepas menjalankan skrip, kami mempunyai akses kepada menu mudah:

Item pertama (tekan 1 dan masukkan) bertanggungjawab untuk proses sandaran dan memaparkan senarai fail konfigurasi templat yang tersedia untuk tapak.

Perkara kedua ialah menjana templat fail konfigurasi dan membukanya untuk diedit.

Perkara ketiga - maklumat ringkas pada menulis fail templat.

Dalam rajah di bawah, menu dibuka dengan pilihan tapak yang tersedia untuk tempahan:

Di sini sub-item "0. Semua tapak yang disenaraikan di bawah" bertanggungjawab untuk memulakan sandaran semua tapak dengan fail konfigurasi yang disenaraikan di bawah. Jadi anda boleh menyandarkan satu tapak atau kesemuanya sekali gus.

Contoh fail konfigurasi untuk skrip

Berikut ialah contoh fail konfigurasi somesite.com.ini untuk membuat sandaran somesite.com:

Sitename_string=somesite_com store_path=D:\Backup\ archive_method=7z archive_password=StrOngp@sswOrd nama hos=000.111.222.333 ssh_user=root ssh_password=p@ssmetotheserver mysql_user=WQmL_password_mysql 85g mysql_db_name=site1_db dirs_to_backup=/var/www/somesite. com /www/* /var/www/somesite.com/www/.htaccess

Seperti yang anda lihat, semuanya mudah dan tidak ada yang berlebihan. Saya akan memberitahu anda secara terperinci tentang setiap baris tetapan:

rentetan_sitename - tetapkan nama yang jelas pada tapak (hanya Latin dan simbol _).

store_path - laluan ke komputer tempatan, tempat arkib sandaran akan dimuat turun.

archive_method - kaedah untuk mengarkibkan fail tapak.

  • 7z - pengarkib dengan nama yang sama akan digunakan, output akan menjadi arkib dengan sambungan "zip".
  • gz - mengarkib menggunakan TAR+GZip, output akan menjadi arkib dengan sambungan "tgz" .

archive_password - arkib kata laluan, hanya berfungsi apabila archive_method=7z .

nama hos - alamat IP luaran atau domain pelayan di mana tapak web dan pangkalan data dihoskan.

ssh_user - nama pengguna untuk menyambung melalui SSH. Dalam kebanyakan kes, anda memerlukan root untuk melaksanakan semua operasi, walaupun anda boleh cuba menyediakannya untuk pengguna lain yang tidak mempunyai hak istimewa.

ssh_password!! - kata laluan untuk pengguna di atas.

mysql_user * - nama pengguna untuk menyambung ke pangkalan data tapak pada pelayan MySQL.

mysql_password - kata laluan untuk pengguna MySQL di atas. Mesti dipasang!

mysql_db_name - nama pangkalan data tapak yang akan kami lakukan pembuangan penuh.

dirs_to_backup ** - tulis senarai laluan penuh, direktori dan fail yang dipisahkan oleh ruang yang perlu diarkibkan.

Nota:

Jika anda membiarkan nilai kosong, kata laluan akan diminta kemudian mod interaktif(Saya cadangkan jangan simpan kata laluan).

* Diandaikan bahawa skrip dan pangkalan data data MySQL dihoskan pada pelayan yang sama. Iaitu, alamat pelayan MySQL ialah 127.0.0.1 (localhost).

** Secara lalai, pengarkib tidak membungkus fail .htaccess, jadi anda perlu juga menentukan laluan penuh kepada mereka!

** Pastikan untuk menentukan laluan penuh, bukan relatif, ke folder atau fail.

Anda boleh mencipta seberapa banyak fail konfigurasi yang anda suka; apabila anda menjalankan skrip, nama setiap satu akan dipaparkan dengan nombor yang ditetapkan. Untuk mula bekerja, anda perlu memasukkan nombor konfigurasi (nombor) dan itu sahaja (jika anda tidak mempunyai 't menentukan kata laluan, kemudian masukkan kata laluan lain).

Bersedia untuk bekerja dan menggunakan skrip

Semuanya sangat mudah!

Langkah pertama ialah memutuskan di mana kami akan menyimpan skrip dengan semua konfigurasinya. Saya cadangkan jangan simpan program yang serupa dan data pada mesin tempatan V borang terbuka, kerana ia tidak selamat, terutamanya jika kata laluan untuk akses root kepada pelayan. Kompleks ini boleh disimpan di suatu tempat pada medium yang disulitkan atau di suatu tempat di mana virus atau orang asing. Dari segi keselamatan, pilihan di tangan anda, jom teruskan.

Biarkan keseluruhan kompleks terletak di sepanjang laluan:

  • D:\Backup\ - arkib sandaran akan dimuatkan di sini.
  • D:\Backup\script\ - skrip dan program WinSCP kami akan terletak di sini.

1) Muat turun versi terkini program WinSCP yang dikonfigurasikan dan mudah alih daripada tapak web PortableApps - WinSCP Portable. Kami memasang program dalam folder D:\Backup\script\ - folder WinSCPPortable akan dibuat di sana, dan akan ada fail WinSCPPortable.exe di dalamnya.

2) Muat turun arkib dengan skrip dan templat di sini - backup_sites_v1.2 dan buka bungkusannya ke dalam folder D:\Backup\script\.

3) Buka fail backup_sites_v1.2.bat untuk mengedit dan mengedit laluan dalam bahagian "WinSCP configuration":

  • "D:\Backup\script\WinSCPPortable\WinSCPPortable.exe" - laluan ke program WinSCP Portable;
  • "D:\Backup\script\WinSCPPortable\Data\settings\winscp.log" - laluan di mana fail log program mudah alih WinSCP dicipta.

Kami memastikan bahawa laluan yang ditulis dalam skrip sepadan dengan laluan di mana program WinSCP berada, jika tidak, ia tidak akan bermula.

4) Kami mencipta fail templat untuk sandaran tapak web. Terdapat beberapa daripadanya dalam arkib - namakan semula mereka mengikut nama domain tapak anda, dan padamkan yang tidak perlu.

Buat templat baharu laman web untuk skrip dengan cara berikut:

  1. Hanya salin fail INI, menamakan semula kepada nama yang betul, dan kemudian kami mengedit tetapan di dalamnya;
  2. Kami menjana templat menggunakan skrip. Jalankan skrip, tekan 2 dan masukkan nama domain atau nama tapak (hanya aksara Latin dan simbol _). Notepad akan dibuka dengan fail yang baru dibuat, selepas perubahan yang dibuat simpan dan tutup.

Pilihan mana yang lebih mudah - pilih sendiri.

5) Semuanya sudah sedia, anda boleh menjalankan skrip dan cuba membuat salinan sandaran salah satu tapak anda.

Selepas mengesahkan pemilihan tapak untuk sandaran, anda mungkin diminta untuk kata laluan. pengguna SSH, jika ia tidak dinyatakan dalam fail konfigurasi. Tetingkap akan segera dibuka dengan log program WinSCP, yang akan memaparkan kemajuan tindakan pada pelayan, serta kemajuan memuat turun arkib siap dari pelayan.

Apabila WinSCP selesai memuat turun arkib, tetingkap akan ditutup; untuk menamatkan skrip, hanya tekan sebarang kekunci dalam tetingkap.

Mengenai keselamatan data

Skrip semasa operasinya menjana fail sementara".tmp" dengan set arahan untuk WinSCP. Fail ini mengandungi log masuk dan kata laluan untuk mengakses pelayan melalui SSH.

Templat INI dengan tetapan tapak juga mengandungi maklumat penting - ini adalah parameter capaian pangkalan data.

Saya amat TIDAK mengesyorkan menyimpan skrip dan fail tetapan ini pada cakera yang boleh diakses terus pada bila-bila masa selepas pelancaran dan manipulasi mudah dengan komputer. Untuk storan, anda boleh membuat cakera yang disulitkan atau membeli media berasingan.

Skrip ini hanyalah alat yang menjimatkan masa untuk melakukan rutin dan tindakan serupa. Luangkan masa dan bimbang tentang keselamatan dan keselamatan data anda!

Semua tanggungjawab untuk menggunakan skrip ini terletak pada anda, berhati-hati!

Kesimpulan

Skrip boleh dilaraskan dan diubah suai supaya ia menjadi lebih berfungsi dan melaksanakan tindakan yang anda perlukan di tapak anda.

Juga kaedah ini automasi WinSCP boleh digunakan untuk membina skrip lain yang akan berfungsi tugas yang berbeza pada VPS atau pelayan Dedicated anda melalui konsol.

Kemas kini: 21/07/2017 Diterbitkan: 15/08/2016

Skrip ini ditulis dalam Unix Shell berjalan sistem operasi CentOS. Ia akan berfungsi pada kebanyakan sistem Keluarga Linux dan BSD.

Contoh skrip

Skrip akan mencipta dump sendiri untuk setiap pangkalan data. Ini adalah perlu untuk pemulihan cepat data.

  1. #!/bin/bash
  2. PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
  3. destination="/backup/mysql"
  4. userDB="sandaran"
  5. passwordDB="sandaran"
  6. fdate=`tarikh +%Y-%m-%d`
  7. cari $destination -type d \(-name "*-1[^5]" -o -name "*-?" \) -ctime +30 -exec rm -R () \; 2>&1
  8. cari $destination -type d -name "*-*" -ctime +180 -exec rm -R () \; 2>&1
  9. mkdir $destinasi/$fdate 2>&1
  10. untuk dbname dalam pangkalan data `echo show | mysql -u$userDB -p$passwordDB | grep -v Pangkalan Data`; buat
  11. kes $dbname dalam
  12. skema_maklumat)
  13. teruskan;;
  14. mysql)
  15. teruskan;;
  16. skema_prestasi)
  17. teruskan;;
  18. ujian)
  19. teruskan;;
  20. *) mysqldump --databases --skip-comments -u$userDB -p$passwordDB $dbname | gzip > $destination/$fdate/$dbname.sql.gz ;;
  21. selesai;

Penerangan skrip

1 Kami menunjukkan jalan ke jurubahasa.
2 Kami menetapkan pembolehubah sistem supaya kami tidak perlu menulisnya dalam skrip laluan penuh kepada fail boleh laku.
4 - 7 Kami menetapkan pembolehubah.
4 Direktori di mana kami akan menyimpan sandaran.
5 Akaun untuk menyambung ke pangkalan data.
6 Kata laluan untuk menyambung ke pangkalan data.
7 Tarikh apabila skrip berjalan.
9 Kami mencari semua sandaran yang lebih lama daripada 30 hari dan memadamkannya. Kami meninggalkan fail untuk arkib pada 15hb.
10 Kami memadamkan semua sandaran yang lebih lama daripada 180 hari.
11 Kami mencipta direktori di mana kami akan menyimpan sandaran. Sebagai nama direktori, kami menggunakan tarikh pelancaran skrip dalam format YYYY-MM-DD.
13 - 25 Kami menyambung ke pangkalan data dan mengeluarkan senarai semua pangkalan data. Kami membuat salinan sandaran untuk setiap satu.
15 - 22 Kami melangkau pangkalan data perkhidmatan information_schema, mysql, performance_schema, test.
23 Kami membuat salinan sandaran untuk pangkalan data.

Menyediakan sistem

Sambung ke pangkalan data dan buat akaun dengan hak untuk mencipta salinan sandaran:

> BERI PILIHAN, Tunjukkan PANDANGAN, MUAT SEMULA, KLIEN REPLIKAN, ACARA, PENCETUS, KUNCI JADUAL PADA *.* KEPADA backup@localhost DIKENAL PASTI OLEH "backup";

* V dalam contoh ini kita buat akaun sandaran dengan kata laluan sandaran.

Buat direktori di mana sandaran akan disimpan:

mkdir -p /backup/mysql

Menyimpan data pada komputer jauh

Sandaran mesti dibuat pada komputer jauh atau pemacu luaran supaya ia tersedia jika pelayan gagal. Contoh ini menggunakan folder kongsi pada pelayan jauh, yang akan mengandungi fail sandaran.

Untuk memudahkan proses pemasangan folder rangkaian, buka fail berikut untuk mengedit:

dan tambahkan baris berikut kepadanya:

//192.168.0.1/backup /mnt cifs user,rw,noauto,credentials=/root/.smbclient 0 0

* dalam contoh ini, folder kongsi dipasang sandaran pada pelayan dengan alamat IP 192.168.0.1 kepada katalog /mnt. Sebagai rangkaian sistem fail digunakan cifs(Protokol SMB: pelayan samba atau dikongsi folder Windows). Parameter sambungan - pengguna: membenarkan mana-mana pengguna untuk melekapkannya, rw: dengan kebenaran membaca dan menulis, noauto: jangan lekapkan secara automatik pada permulaan sistem, kelayakan: fail di mana log masuk dan kata laluan untuk menyambung ke folder kongsi ditulis.

Sekarang mari buat fail dengan log masuk dan kata laluan:

# vi /root/.smbclient

dan bawa ke borang berikut:

nama pengguna=sandaran
kata laluan=sandaran

* nama pengguna: Nama pengguna, kata laluan: kata laluan. Sudah tentu, dalam kes anda, nyatakan data anda.

Sekarang masukkan arahan berikut.

Sandaran maklumat penting- setiap Pentadbir Sistem menghadapi cabaran ini. Tugas itu kelihatan remeh dan tidak akan menimbulkan minat ramai pembaca. Tetapi, sebagai contoh, saya ingin artikel sedemikian masuk detik tertentu akan banyak membantu, jadi saya rasa perlu ada artikel ini.

Tugasan: Sandaran data ke direktori tempatan dan ke pelayan berasingan, menggunakan minimum perisian pihak ketiga, mengelog dan memberitahu pentadbir dalam Jabber sekiranya berlaku kegagalan. Semua fungsi asas kebanyakan perisian sandaran automatik, tetapi tanpa memasangnya, dan oleh itu tanpa pepijatnya (yang, sebenarnya, membawa kepada idea ini).

Sekarang mari kita turun ke perniagaan.

Mula-mula, mari buat dan buka skrip
skrip sandaran nano
Sekarang mari tambah baris pada skrip
#!/bin/bash
Mari kita isytiharkan beberapa pembolehubah.
TN - TASKNAME - nama tugas. Digunakan untuk mengeluarkan ke log dan menentukan nama fail.
Memandangkan terdapat beberapa tugasan (bulanan, mingguan, harian) dan saya terlalu malas untuk menulis skrip untuk setiap kes, saya mencipta satu tugasan universal di mana anda hanya perlu menyahkomen garisan yang diperlukan. Nama tugas mesti ditulis tanpa ruang, sebaik-baiknya dalam bahasa Latin, jika anda tidak mahu masalah dengan pengekodan dan parameter arahan yang salah.
TN=dokumen-bulanan
#TN=docs-mingguan
#TN=docs-daily
OF - Output File - nama fail output. Diperolehi daripada pembolehubah TN, iaitu nama kerja.
OF=$TN.tar.gz
Kami mengisytiharkan pembolehubah dengan laluan ke fail log, dan kemudian semua mesej ralat dan perkara lain akan dikeluarkan kepada log.
LOGFILE=/var/log/backup.log
Mari buat catatan log tentang permulaan sandaran (tarikh, masa, nama tugas)
echo >>$LOGFILE echo "========================================================== ============== ==========" >>$LOGFIL bergema "$(tarikh +"%d-%b-%Y %R")" > >$LOGFILE echo "Tugas \"$TN\" telah bermula. .." >>$LOGFILE
Terdapat masalah bahawa jika anda menentukan nama direktori dengan ruang dalam parameter arahan (cth tar), skrip akan gagal. Penyelesaiannya ditemui di Internet - bilik operasi sistem linux menggunakan ruang sebagai pemisah parameter arahan standard. Mari kita takrifkan semula pemisah standard (disimpan dalam pembolehubah $IFS) sebagai sesuatu selain ruang, contohnya \n sebagai pemisah baris.
Ingat nilai lama pemisah standard
OLD_IFS=$IFS
Gantikan pemisah standard dengan pemisah anda sendiri
IFS=$"\n"
SRCD - SouRCe Directory - direktori dengan data sandaran
Kini anda boleh menyenaraikan beberapa direktori, pemisah akan menjadi pemisah baris, seperti yang kami nyatakan dalam baris di atas
SRCD="/mnt/source/folder_1 /mnt/source/folder_2 /mnt/source/folder_N"
TGTD - Direktori TarGeT - direktori di mana sandaran akan disimpan
TGTD="/var/backups/"
Sememangnya, kami faham bahawa menyimpan sandaran penting hanya pada sumber adalah sekurang-kurangnya remeh. Oleh itu, kami akan meninggalkan salinan sumber jauh, yang akan kami lekapkan secara berasingan menggunakan mount dan fstab. Saya akan segera menerangkan sebab saya menggunakan mount dan fstab, dan bukan hanya mount - saya memasang direktori ini dalam skrip saya yang lain, dan seperti yang dikatakan oleh salah seorang rakan pengaturcara saya - pengaturcara yang baik tidak akan menulis kod yang sama dua kali (entah bagaimana, saya tidak ingat verbatim, tetapi saya harap saya dapat memahami maksudnya).
TGTD2="/mnt/archive/"
Proses pengarkiban itu sendiri dalam pilihan "Buat". arkib baharu"
tar -czf $TGTD$OF $SRCD &>>$LOGFILE
dan dalam pilihan "Kemas kini fail dalam arkib lama"
tar -u -f $TGTD$OF $SRCD &>>$LOGFILE
Dalam kes kedua, adalah lebih baik untuk menggunakan nama fail tertentu dan bukannya $OF kerana, sebagai contoh, arkib mingguan saya dikemas kini setiap hari, dan $TN (nama tugas) mereka tidak sepadan, dan oleh itu $OF.

Dalam pembolehubah "?" Status pelaksanaan perintah terakhir dimusnahkan. Jom simpan untuk digunakan nanti.
STATUS=$?
Mengembalikan pemisah standard kepada nilai asal
IFS=$OLD_IFS
Sekarang mari tambah syarat - jika proses pembungkusan masuk arkib tar berakhir dengan ralat, hantar mesej kepada pentadbir, padam fail gagal sandaran. Jika tidak, kami meneruskan lebih jauh - kami memasang bahagian rangkaian dan membuang salinan arkib ke dalamnya. Selepas setiap operasi, kami menyemak hasil pelaksanaan, menulis log, dan sama ada meneruskan atau memberitahu pentadbir dan mengganggu prosedur.
jika [[ $STATUS != 0 ]]; kemudian rm $TGTD$OF &>>$LOGFILE echo "########################################## ######" >>$LOGFILE echo "### Ralat telah berlaku! Sandaran gagal. ###" >>$LOGFILE echo "################## # ##############################" >>$LOGFILE echo "$(tarikh +"%d-%b-%Y % R%nFail ") $OF sandaran tidak dibuat" | sendxmpp -t -f /usr/local/etc/XMPP_settings recipient_login@domain &>>$LOGFILE else echo "Fail sandaran disimpan sebagai \"$TGTD$OF\"" >>$LOGFILE echo "Sandaran berjaya diselesaikan pada $(tarikh +"%R %d-%b-%Y")!" >>$LOGFILE bergema "Memasang sistem fail untuk arkib sandaran $TGTD_archive" >>$LOGFILE melekapkan $TGTD2 &>>$LOGFILE jika [[ $? != 0 ]]; kemudian echo "#################################################### ##############" >>$LOGFILE echo "### Ralat berlaku semasa memasang sumber sandaran ###" >>$LOGFILE echo "######## ## ################################################## ## #" >>$LOGFILE gema "$(tarikh +"%d-%b-%Y %R%nFail") sandaran $OF tidak disalin ke sumber sandaran" | sendxmpp -t -f /usr/local/etc/XMPP_settings recipient_login@domain &>>$LOGFILE exit fi echo "Penyalinan fail ke sumber sandaran dimulakan" >>$LOGFILE cp -f $TGTD$OF $TGTD_archive$OF &>> $LOGFILE jika [[ $? != 0 ]]; kemudian echo "#################################################### ##############" >>$LOGFILE echo "### Ralat berlaku semasa menyalin ke sumber sandaran ###" >>$LOGFILE echo "######## ## ################################################## ## ##" >>$LOGFILE gema "$(tarikh +"%d-%b-%Y %R%nFail") sandaran $OF tidak disalin ke sumber sandaran" | sendxmpp -t -f /usr/local/etc/XMPP_settings recipient_login@domain &>>$LOGFILE else echo "Penyalinan fail berjaya diselesaikan pada $(tarikh +"%R %d-%b-%Y")!" >>$LOGFILE echo "Fail disalin sebagai \"$TGTD_archive$OF\"" >>$LOGFILE fi echo "Menyahlekap sistem fail untuk arkib sandaran $TGTD_archive" >>$LOGFILE umount $TGTD2 &>>$LOGFILE echo " Semua operasi berjaya diselesaikan!" >>$LOGFILE fi keluar

Dalam proses itu, kami menyalin arkib dari storan tempatan ke yang jauh. Sememangnya, kami menyemak bahawa setiap operasi telah berjaya diselesaikan dan menulis segala-galanya dalam log.
Untuk menghantar mesej kepada pentadbir, saya menggunakan mesej XMPP, kerana organisasi itu mempunyai pelayan Jabber, dan saya lebih suka menerima mesej cepat tentang kegagalan, daripada pergi ke e-mel saya, menaip kata laluan, mengklik pada pautan, dan menunggu pelayar memaparkan segala-galanya kepada saya. Walau apa pun, tiada siapa yang menghalang anda daripada menggunakan sendmail dan bukannya sendxmpp.
Fail /usr/local/etc/XMPP_settings mengandungi yang berikut:

#sender_login@domain;jabber_server_IP:jabber_server_port sender_password login@domen;127.0.0.1:5222 kata laluan
DALAM fail fstab rentetan yang menerangkan sambungan kepada saham Windows
//192.168.0.250/arhiv /mnt/archive cifs noauto,rw,iocharset=utf8,cp866,file_mod=0666,dir_mod=0777,noexec,_netdev,credentials=/root/.passwd_to_archive 0_directory 0
Kini yang tinggal hanyalah menambah tugas pada cron. Ini boleh dilakukan menggunakan fail /etc/crontab, tetapi disebabkan tabiat GUI saya, diwarisi daripada Windows, saya menggunakan antara muka web untuk kes sedemikian. Perintah mesti dilaksanakan dengan hak root, iaitu, sebagai contoh, sudo bash backup_script. Dengan menambahkan arahan pada cron, anda boleh menentukan bahawa ia akan segera dilaksanakan sebagai root

Semasa perbincangan, masalah pertumbuhan balak telah dibangkitkan. Saya mengikuti laluan paling mudah (pada pendapat saya): kami akan menyimpan hanya N baris terakhir log, contohnya 300. Dua baris akan ditambah pada skrip, di mana kami akan menyimpan 300 baris terakhir log ke fail sementara, maka kami akan memadamkan log dengannya
ekor -n 300 $LOGFILE >/tmp/unique_fantastic_filename.tmp mv -f /tmp/unique_fantastic_filename.tmp $LOGFILE
Saya akan bawa awak teks penuh skrip:
#!/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 "$(tarikh +"%d-%b-%Y %R")" >>$LOGFILE echo "Tugas \"$TN\" bermula..." >>$ 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 STATUS=$? IFS=$OLD_IFS jika [[ $STATUS != 0 ]]; kemudian rm $TGTD$OF &>>$LOGFILE echo "########################################## ######" >>$LOGFILE echo "### Ralat telah berlaku! Sandaran gagal. ###" >>$LOGFILE echo "################## # ##############################" >>$LOGFILE echo "$(tarikh +"%d-%b-%Y % R%nFail ") $OF sandaran tidak dibuat" | sendxmpp -t -f /usr/local/etc/XMPP_settings recipient_login@domain &>>$LOGFILE else echo "Fail sandaran disimpan sebagai \"$TGTD$OF\"" >>$LOGFILE echo "Sandaran berjaya diselesaikan pada $(tarikh +"%R %d-%b-%Y")!" >>$LOGFILE bergema "Memasang sistem fail untuk arkib sandaran $TGTD_archive" >>$LOGFILE melekapkan $TGTD2 &>>$LOGFILE jika [[ $? != 0 ]]; kemudian echo "#################################################### ##############" >>$LOGFILE echo "### Ralat berlaku semasa memasang sumber sandaran ###" >>$LOGFILE echo "######## ## ################################################## ## #" >>$LOGFILE gema "$(tarikh +"%d-%b-%Y %R%nFail") sandaran $OF tidak disalin ke sumber sandaran" | sendxmpp -t -f /usr/local/etc/XMPP_settings recipient_login@domain &>>$LOGFILE exit fi echo "Penyalinan fail ke sumber sandaran dimulakan" >>$LOGFILE cp -f $TGTD$OF $TGTD_archive$OF &>> $LOGFILE jika [[ $? != 0 ]]; kemudian echo "#################################################### ##############" >>$LOGFILE echo "### Ralat berlaku semasa menyalin ke sumber sandaran ###" >>$LOGFILE echo "######## ## ################################################## ## ##" >>$LOGFILE gema "$(tarikh +"%d-%b-%Y %R%nFail") sandaran $OF tidak disalin ke sumber sandaran" | sendxmpp -t -f /usr/local/etc/XMPP_settings recipient_login@domain &>>$LOGFILE else echo "Penyalinan fail berjaya diselesaikan pada $(tarikh +"%R %d-%b-%Y")!" >>$LOGFILE echo "Fail disalin sebagai \"$TGTD_archive$OF\"" >>$LOGFILE fi echo "Menyahlekap sistem fail untuk arkib sandaran $TGTD_archive" >>$LOGFILE umount $TGTD2 &>>$LOGFILE echo " Semua operasi berjaya diselesaikan!" >>$LOGFILE fi ekor -n 300 $LOGFILE >/tmp/unique_fantastic_filename.tmp mv -f /tmp/unique_fantastic_filename.tmp $LOGFILE keluar

Terima kasih semua atas perhatian anda!

Sandaran harus sedemikian rupa sehingga anda boleh menukar hoster pada bila-bila masa dan beralih ke pelayan baharu. Oleh itu, keseluruhan proses mencipta arkib mesti diautomasikan. Dan fail sandaran harus disimpan di tempat yang selamat dengan akses sepanjang masa dari mana-mana sahaja di dunia.

Saya menerbitkan satu lagi penyelesaian untuk membuat sandaran pelayan web. Skrip bash ini mencipta satu arkib pangkalan data dan semua fail tapak. Untuk kemudahan, 30 sandaran terbaharu disimpan secara setempat pada cakera. Dan untuk kebolehpercayaan, arkib sandaran disiarkan pada penyimpanan awan Yandex.Disk.
Terdapat banyak penyelesaian serupa di Internet. Tetapi skrip ini mencerminkan sepenuhnya visi saya untuk membuat sandaran pelayan web.

Prinsip asas sandaran

Kami mencipta arkib menggunakan alat sistem pengendalian terbina dalam untuk memudahkan proses mencipta arkib dan mempercepatkan pemulihan tapak pada pelayan baharu jika perlu.
Kami menggunakan format arkib yang membolehkan anda menyimpan semua atribut fail dan folder. Untuk mendapatkan salinan tepat tapak di lokasi baharu.
Kami mengarkib dan memampatkan pangkalan data dan direktori pelayan web secara berasingan dengan semua fail. Dan kemudian kami menggabungkannya menjadi satu arkib tanpa pemampatan. Untuk kemudahan, kami membentuk nama arkib berdasarkan nama domain dan tarikh penciptaannya.
Jom beratur storan tempatan daripada 30 salinan arkib terkini. Untuk dapat "mengembalikan" tapak ke keadaan sebelumnya dalam kes situasi yang tidak dijangka. Contohnya, apabila dijangkiti virus. Ataupun kemas kini gagal CMS.
Kami mengatur storan sandaran bebas dalam storan awan Yandex.Disk dan memuat naik arkib kami di sana.

Skrip BASH untuk membuat sandaran fail tapak dan pangkalan data MySQL

#!/bin/bash # #ver 1.0 #2013-09-09 # #Pembolehubah Pangkalan Data DBHOST="localhost" #Alamat pelayan MySQL DBUSER="bd_user" #Nama pengguna pangkalan data DBPASS="dBpAsS" #Kata laluan pengguna pangkalan data DBNAME="db_name" #Nama pangkalan data DBARC=$DBNAME.sql.gz #Nama arkib pangkalan data # #Variables WEBDAV WEBDAVURL="https ://webdav .yandex.ru/backup/" #Yandex.Alamat cakera. Folder itu mesti wujud! WEBDAVUSER=" [e-mel dilindungi]" #Nama Pengguna daripada Yandex.Disk (Yandex.Mail) WEBDAVPASS="MyPasWordAtYandexMail" #Kata Laluan daripada Yandex.Disk # #Pembolehubah tapak SCRIPTDIR="/home/serveruser/backup/" #Laluan mutlak dari mana skrip dilancarkan dan tempat SCRDIR arkib disimpan ="/home/serveruser/web/mydomain.com/public_html/" #Laluan mutlak ke tapak dari akar cakera SCREXCLUDE="webstat" #Apa yang tidak akan disertakan dalam arkib SCRARC="public_html. tar.gz" #Nama arkib fail tapak # #Pembolehubah Sandaran ARCNAME="mydomain.com"=$(tarikh "+%F(%H:%M)")".tar" #Nama sandaran tapak ARCMAX="30" #Bilangan fail dalam storan setempat # # Mari pergi ke direktori akar cd pelayan web $SCRDIR # #Buat arkib fail dengan pemampatan, ambil kira pengecualian tar cfz $SCRIPTDIR$SCRARC --exclude=$SCREXCLUDE * # #Kembali ke folder dengan skrip, di mana semua arkib terletak cd $SCRIPTDIR # #Arkibkan pangkalan data dengan compression mysqldump -h$DBHOST -u$DBUSER - p$DBPASS $DBNAME | gzip > $DBARC # #Gabungkan arkib fail dan longgokan pangkalan data, kini tanpa tar mampatan cf $SCRIPTDIR$ARCNAME $SCRARC $DBARC # #Hantar hasilnya ke Yandex.Disk curl --user $WEBDAVUSER:$WEBDAVPASS -T $ARCNAME $ WEBDAVURL # #Mengalih keluar arkib perantaraan rm *.gz # #Memadam salinan lama tapak, meninggalkan beberapa salinan baharu ls -t *.tar | ekor -n+$ARCMAX | xargs rm -f

Sekarang mari kita lihat skrip sekeping demi sekeping. Semuanya jelas dengan pembolehubah yang dinyatakan pada permulaan skrip. Saya cuba memisahkan lalat dari potongan daging sebanyak mungkin dan mengulas semua yang diperlukan.
Mari kita beralih ke bahagian skrip boleh laku.

Cara membuat arkib fail tapak

Sebagai peraturan, tiada masalah dengan membuat arkib. Perkara utama bukanlah untuk dikelirukan dengan mutlak dan laluan relatif. Untuk memastikan perkara yang anda arkibkan dan di mana anda mengarkibkannya.
Untuk mengelakkan lengkap laluan mutlak dalam arkib, mula-mula pergi ke direktori akar tapak.

Saya tidak suka cara itu, anda membuka arkib dan terdapat folder rumah, anda masuk ke dalamnya, dan ada satu lagi, anda masuk ke dalamnya, diikuti dengan yang seterusnya, dan seterusnya, secara ringkasnya, anak patung bersarang. Anda akan keletihan mencuba untuk mendapatkan kandungannya.
Oleh itu, sebelum membuat arkib, mari jalankan arahan:

Cd$SCRDIR

Kemudian arkib akan serta-merta mengandungi kandungan direktori akar tapak tanpa sebarang folder dan subfolder. Macam itu:


Jika anda mempunyai fail yang tidak perlu ada dalam sandaran tapak, bagi saya ini adalah folder webstat, maka anda perlu mengkonfigurasi parameter --exclude.

Ketahui lebih lanjut tentang semua pilihan tar Anda boleh membacanya dalam manual rasmi.

Cara Membuat Sandaran Pangkalan Data MySQL

Untuk mendapatkan longgokan pangkalan data, kami memerlukan parameter akses kepadanya. Kesemuanya diterangkan dalam pembolehubah skrip dan tidak boleh menyebabkan sebarang kesulitan. Untuk mengurangkan saiz fail, mampatkan output utiliti mysqldump. saya guna gzip, yang hadir secara lalai dalam *NIXs.
Jika anda menggunakan yang lama versi MySQL pelayan, sehingga 4.1, maka pada pangkalan data yang besar parameter mungkin berguna --cepat. Penggunaan yang memberitahu arahan mysqldump Tulis dump pangkalan data dengan segera ke cakera, dan bukannya menyimpannya dalam memori. Dalam lebih versi terkini pilihan ini didayakan secara lalai.

Fail sandaran tapak tunggal

Untuk menjadikan penyelesaian itu elegan, kami akan menggabungkan dua arkib fail tapak dan longgokan pangkalan data ke dalam satu arkib. Hanya sekarang tanpa mampatan, kerana kami sebelum ini melewati setiap daripada mereka gzip.
Untuk kemudahan, nama fail akan terdiri daripada nama domain yang digunakan dan masa penciptaan.

Bagaimana untuk menyimpan salinan sandaran tapak web dalam Yandex.Disk

Yandex.Disk tidak semestinya perlu bertindak sebagai storan awan. Anda boleh menggunakan, sebagai contoh, Microsoft SkyDrive atau mana-mana perkhidmatan lain yang menggunakan protokol WebDAV untuk akses.

Bagaimana untuk mengalih keluar salinan fail lama sambil mengekalkan beberapa yang terakhir

Pada akhir skrip kami akan keluarkan fail yang tidak diperlukan, ini adalah arkib fail dan pangkalan data dan kami akan mengehadkan bilangannya salinan arkib tapak.
Kami akan mencari salinan sandaran yang lapuk dan, jika ada, memadamkannya. Kod berikut bertanggungjawab untuk ini:

Ls -t *.tar | ekor -n+$MAXARC | xargs rm -f

Bagaimana ia berfungsi? Dengan arahan ls arkib dicari (fail dengan sambungan tar), output dijana berdasarkan masa fail dibuat. Perintah seterusnya ekor menapis senarai dengan memotong 30 yang pertama daripadanya. Dan selebihnya dipindahkan ke pasukan rm untuk pemadaman. Parameter f Ia berfungsi untuk "senyap" jika tiada apa-apa untuk dipadamkan. Ini berlaku apabila anda baru mula mengumpul sandaran dan bilangannya tidak melebihi nilai pembolehubah $MAXARC.
Sejujurnya, selepas melaksanakan arahan ini, hanya 29 salinan sandaran akan kekal "hidup".

Menjalankan skrip sandaran

Kami menyimpan skrip, sebagai contoh backup.sh. Dan kami memberikan hak pelaksanaan kepadanya:

#chmod +x backup.sh

Cara paling mudah ialah menggunakan CRON untuk menjalankan skrip mengikut jadual. Saya membuat sandaran sekali sehari pada waktu luar puncak, iaitu pada separuh kedua malam pada waktu pagi.
Jangan lupa tentang pemilik folder dan fail apabila kami menjalankan skrip untuk pelaksanaan. Lagipun, fail VASYA pengguna tidak akan dapat diakses jika anda menjalankan skrip sebagai pengguna PETYA.

Keputusan skrip sandaran


Setiap hari pada pukul 6 pagi, salinan sandaran tapak dibuat pada pelayan (fail ditambah pangkalan data) dan dihantar ke storan awan Yandex.Disk.
Semasa menulis artikel ini, pelayan sebenar di mana blog ini dijalankan berfungsi sebagai tapak ujian. Pelayan menggunakan CentOS 6.4 dengan semua kemas kini pada awal September 2013.
Komen dan cadangan tentang cara skrip berfungsi dialu-alukan. Terdapat rancangan untuk melaksanakan had pada bilangan salinan sandaran bukan sahaja pada pelayan, tetapi juga dalam awan Yandex.Disk. Sementara itu, arkib yang terkumpul dari semasa ke semasa perlu dibersihkan secara manual.