Показаны сообщения с ярлыком Резервное копирование. Показать все сообщения
Показаны сообщения с ярлыком Резервное копирование. Показать все сообщения

суббота, 21 ноября 2020 г.

Бэкап базы mssql с остановкой 1с

 Тут попросили меня накатать сценарий для копирования всего каталога с содержимым БД mssql, но перед тем как его паковать - надо прибить все определённые процессы у пользователей, за исключением тех, что принадлежат администратору, потом остановить сам сервер mssql, запаковать содержимое директории БД в архив, который разместить в бэкапах и в конце удалить все архивы, которые старше 7 дней... Итак скрипт:


@echo off
taskkill /f /fi "USERNAME ne administrator" /im 1cv7s.exe
net stop MSSQLSERVER
"C:\scripts\x64\7za.exe" a D:\backup\backupshare_%date:~-10,2%%date:~-7,2%%date:~-4,4%.7z D:\Bases\
net start MSSQLSERVER
forfiles -p "D:\backup" -s -m *.7z -d -7 -c "cmd /c del @PATH"

четверг, 9 января 2020 г.

Скрипт для бэкапа файлов сайта и базы данных mysql с помощью percona-xtrabackup

Понадобилось на одном хосте мне бэкапить базы данных mysql различных сайтов и их файлов...

Есть такой замечательный инструмент для бэкапа БД как xtrabackup. С помощью оного я буду делать бэкап БД (процесс резервирования порой бывает затратный по времени, но процесс развёртывания резервной копии намного быстрее нежели при использовании популярного у народа mysqldump + в моём случае я резервирую совершенно все базы за раз, а также имею лучшую целостность БД и сохраняю все учётные записи и их права доступа).

Для mysql версий 4x, 5x:

sudo -s
cd /opt
apt install xtrabackup p7zip-full
git clone https://github.com/constantinekg/sitebackup_with_mysql/
cd sitebackup_with_mysql/
echo 'Edit backup script for your settings...'
nano  backupdb.py
chmod +x backupdb.py
mkdir /backup

Для mysql версий 8x:

sudo -s
wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
apt update
apt install percona-xtrabackup-80 p7zip-full
git clone https://github.com/constantinekg/sitebackup_with_mysql/
cd sitebackup_with_mysql/
echo 'Edit backup script for your settings...'
nano backupdb8.py
chmod +x backupdb8.py
mkdir /backup


Запускаем и проверяем:

./backupdb.py

Запихиваем задачу в крон:

crontab -e

01 * * * * /opt/sitebackup_with_mysql/backupdb.py # Для mysql 4/5x

01 * * * * /opt/sitebackup_with_mysql/backupdb8.py


Как восстанавливать...

В сути необходимо распаковать содержимое бэкапа (файлы БД) в /var/lib/mysql, предварительно перед этим остановив mysql сервер ( systemctl stop mysql ) и выставить там необходимые права на доступ, после чего запустить mysql сервер ( systemctl start mysql ). Готово!

rsync -avrP /data/backup/ /var/lib/mysql/
chown -R mysql:mysql /var/lib/mysql

вторник, 18 июня 2019 г.

Безопасность для блогера и прочих авторов крутяцкого контента

Недавно меня попросили рассказать на тему безопасности авторов различных youtube-каналов 
и прочих блогов. Я подумал что в целом давно я ничего такого не писал и вот как бы небольшое 
эссе на эту тему... Комментарии и всё в таком духе приветствуются...

Основными правилами, за нарушение которых вводятся какие то санкции по отношению 
к автору со стороны различных социальных сетей или всеобщих мультимедийных 
платформ для ведения блогов являются:
  • Сцены сексуального или порнографического характера.
  • Проявление всех разновидностей ненависти и возмущение откровенной вражды.
  • Угрозы кому либо.
  • Дискриминация, ложь, подлог.
  • Воровство чужого контента и последующее использование оного в своих коммерческих 
    целях или в целях повышения рейтингов.
  • Недолжное отношение к модерации своего контента, вызывающее впоследствии 
    наличие спама, различного другого контента, вводящего в заблуждение пользователей 
    (реклама различных аферистов и т.д.).

В зависимости от поставленной злоумышленником цели имеются различные виды атак, 
которые я постараюсь рассмотреть ниже. Часть из них требует от злоумышленника хороших 
технических навыков, а часть из них является в общем плане доступной широкому кругу лиц. 
Далее по каждому из видов атак я буду делать примечание о степени сложности (требуются 
специальные технические навыки или нет).

четверг, 8 ноября 2018 г.

Синхронизация в разные места по определённым дням недели

Расклад такой:

- Есть сервер, с которого необходимо делать синхронизацию по понедельникам и пятницам на локальный сервер, причём в понедельник в одну директорию, а в пятницу - в другую... Директория сервера с которого мы будем делать синхронизацию примонтированна к локальному серверу по cifs.

Делать буду всё на 3-м питоне...


среда, 27 ноября 2013 г.

Мониторить нельзя не мониторить - ставим правильно запятую

Вот недавно произошёл случай... Звонит ко мне мой фрэнд (он сисадмин) и глаголит что его серверу настал каюк и его надо реанимировать... История стара как мир - жестким дискам пришёл капец, жесткие диски были в первом рейде да и к прочему на выходе оказалось с кучей бэдов... Самое смешное что на мой вопрос - "а какого чёрта ты не снимал резервные копии?", мой кент ответил что он мол их снял и положил (барабанная дробь...) на эти же разделы (которые отправились в небытьё...). Чуточку погрустив за пивом и поняв что тут уже нифига не проделаешь я отправил кента за новыми хардами, потихоньку готовя сервак к новой жизни... К чему я это? Да дело всё в том, что как показывает практика - независимо от объёма бизнеса и вне зависимости от потребностей бизнес процессов необходимо: а) резервировать информацию (я уже про свои наработки писал у себя тут); б) а лучше всего отвечать угрозам заранее - эдакая превентивная мера.

И как недавно у меня...

Вообще я управляю на данный момент не шибко то огромным парком серверов, но они у меня есть... В бытность их становления я заранее предусмотрел систему мониторинга за состоянием жизнедеятельности моего скромного серверного парка, о чём сейчас не сожалею и я прямо таки не нарадуюсь... К примеру на медни один шибко умный юзер решил забить под зарез всё пространство на харде, коий расположен на сервере. Последствия представить не сложно - ноющие пользователи (мол а мы нифига не можем залить), вешающийся сервак и всё в таком духе... Но не тут то было - как только объём инфы начал поглощать оставшееся пространство на одном из винтов сервака я сходу получил милую СМСку и уведомление на почту что мол ахтунг. В итоге я успел вовремя среагировать и увеличить пространство, заодно прочитав лекцию злостному юзеру...

В итоге скажу одно - господа сисадмины, мониторьте и избежите последствий, благо что на эти дела инструментов предостаточно (Cacti, Zabbix(я юзаю) и т.д.). Ну и не забываем про резервирование информации ;).

четверг, 21 ноября 2013 г.

PUBS - Python universal backup script для linux

Данный скрипт был наваян мной в целях автоматизации процессов резервного копирования. Основным назначением является создание резервных копий (архивов с данными) как на локальном хранилище linux серверов, так и их дальнейшее дублирование на удалённом хранилище, которое расположено на windows сервере (зеркало).

В целом такая вот картинка....


Что делает мой скрипт (пошагово):

1. Сначала проверяет доступен ли удалённый windows server, проверяя состояние открытости порта netbios (по умолчанию 135 порт)
2. Затем проверяет запущен ли mysql на локальной машине (по умолчанию 127.0.0.1), проверяя возможность соединиться с портом mysql (по умолчанию 3306).
3. Если проверки прошли удачно, то скрипт начинает монтировать удалённую расшаренную директорию на windows сервере к директории, расположенной на локальном сервере.
3. Если монтирование прошло удачно, то скрипт создаёт новую директорию с именем, отражающим текущую дату в директории на локальном сервере (на примере /backup/20131121/).
4. Далее создаются дампы баз данных, имена которых указаны в переменных скрипта и складируются в ранее созданную директорию (к примеру складируются в  /backup/20131121/, с именами в формате mysql-имя базы-.sql.годмесяцдень.часминутасекунда.gz)
5. Затем пакуются директории в виде tar.gz архивов в ранее созданную директорию (к примеру /backup/20131121/), с именами в формате  dir-путьдодиректориибеззнаков'/'-годмесяцдень.час-минута-секунда.tar.gz.
6. Далее производится очистка от старых файлов и директорий (удаляются те файлы и директории, время модификации которых больше числа указанных дней (к примеру 30).
7. Далее производится синхронизация данных с помощью rsync между локальной директорией, в которой находятся все архивы и удаленной директорией, которая примонтированна к локальной директории.
8. После выполнения синхронизации производится размонтирование удаленной директории и закрытие программы.

Перед тем как приступать к работе:

- Установить rsync
- Установить необходимые пакеты, чтобы корректно срабатывала команда mount -t smbfs //ip/share...

Листинг скрипта:


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# PUBS - Python Universal Backup Script
# Created by Constantine in november 2013
# Mailto: myainetwork@gmail.com
# This script you can find on http://infdots.blogspot.com
# You can use this code under your own risk.

# Variables section
keepdays = '30'                              # How many time (in days) we must keep archives on local storage
addr = '192.168.0.1'                     # IP address of remote windows based server with share
port = '135'                                # Number of port on remote server to try check connection (netbios)
localdir4backups = '/backup/'               # Location of local storage where we will keep all backups
mountdir = '/winshare/'                   # Location of directory where we will mount remote windows share
winshare = 'docs'                   # Name of share on windows based server
winusername = 'administrator'                 # User name who have an access for windows share
winpassword = 'Fan09!%fdkjfd'                    # Password of windows user
workgroup = 'workroup'                           # Workgroup or domain name
backupfolder = ['/var/www/', '/opt/']       # Which directories we will archive to local backup storage
bases = ['joomla','feng','sold']    # Names of databases on local mysql server
mysqlhost = '127.0.0.1'                     # Address of mysql server
mysqlport = '3306'                          # Mysql port number
muser = 'root'                              # Mysql user name
mpass = 'superpuperpassword'                           # Mysql user password

# Importing of some modules
import socket
import sys
import subprocess
import os
import errno
import datetime
import string
import time

# Script vars
now = datetime.datetime.now()
storedir = localdir4backups+str(now.year)+str(now.month)+str(now.day)
ctime = str(now.year)+str(now.month)+str(now.day)+"."+str(now.hour)+"-"+str(now.minute)+"-"+str(now.second)

# Function for delete of old archives on local storage
def oldclear():
    try:
        starttime = time.time()
        oldout = subprocess.PIPE
        ocd = subprocess.Popen(["time find "+localdir4backups+" -type d -mtime +"+keepdays+" -exec rm -rf {} \;", "non existent"], shell=True, stdout=oldout, stderr=oldout)
        time.sleep(2.0)
        ocf = subprocess.Popen(["find "+localdir4backups+" -type f -mtime +"+keepdays+" -exec rm -rf {} \;", "non existent"], shell=True, stdout=oldout, stderr=oldout)
        time.sleep(2.0)
        output = ocd.poll()
        ocd.wait()
        ocf.wait()
        endtime = time.time()
        print (u'Estimated time is: ')
        print endtime - starttime
        print (u'')
    except:
        output = output
    return output


# Function for test port connection on remote backup server (Checking of SMB service is running)
def check_server(address, port):
        # Create a TCP socket
        s = socket.socket()
        print "Attempting to connect to %s on port %s" % (address, port)
        try:
                s.connect((address, port))
                print "Connected to %s on port %s" % (address, port)
                return True
        except socket.error, e:
                print "Connection to %s on port %s failed: %s" % (address, port, e)
                return False

# Function for syncing of local backup and remote
def sync():
    try:
        starttime = time.time()
        sout = subprocess.PIPE
        syncr = subprocess.Popen(["time rsync -avz --delete --stats "+localdir4backups+" "+mountdir, "non existent"], shell=True, stdout=sout, stderr=sout)
        time.sleep(2.0)
        output = syncr.poll()
        syncr.wait()
        endtime = time.time()
        print (u'Estimated time is: ')
        print endtime - starttime
        print (u'')
    except:
        output = output
    return output

# Function for mount remote share to local directory
def mountshare():
    try:
        starttime = time.time()
        loutput = subprocess.PIPE
        mnt = subprocess.Popen(["time mount -t smbfs //"+addr+"/"+winshare+" "+mountdir+" -o username="+winusername+",password="+winpassword+",workgroup="+workgroup, "non existent"], shell=True, stdout=loutput, stderr=loutput)
        time.sleep(2.0)
        output = mnt.poll()
        subprocess.Popen.kill(mnt)
        endtime = time.time()
        print (u'Estimated time is: ')
        print endtime - starttime
        print (u'')
    except:
        output = output
    return output

# Function for unmount remote directory
def unmount():
    try:
        starttime = time.time()
        unout = subprocess.PIPE
        umount = subprocess.Popen(["time umount "+mountdir, "non existent"], shell=True, stdout=unout, stderr=unout)
        time.sleep(2.0)
        output = umount.poll()
        umount.wait()
        endtime = time.time()
        print (u'Estimated time is: ')
        print endtime - starttime
        print (u'')
    except:
        output = output
    return output



# Function for creating folders in date format (Year:month:day) for local backups
def newdir():
    try:
        os.makedirs(storedir)
        result = 0
    except OSError:
        print 'Error can not create directory on local storage. Probably directory exist or you havent any privilegies for writing. Please check your permissions'
        result = 2
        if not os.path.isdir(storedir):
            raise
    except:
        result = 1
    return result


# Function TAR backup directories (such as /var/www etc.)
def tardir(backupfolder):
    clen = len(backupfolder)
    try:
        starttime = time.time()
        result = 0
        for bf in backupfolder:
            p = subprocess.Popen(["time tar -pczf "+storedir+"/"+"dir-"+bf.replace("/",'')+'-'+ctime+".tar.gz"+" "+bf+" > /dev/null 2>&1"], shell=True)
            time.sleep(2.0)
            p.wait()
        endtime = time.time()
        print (u'Estimated time is: ')
        print endtime - starttime
        print (u'')

    except OSError:
        print 'Error can not create archive. Probably file exist or you have not any privilegies for writing. Please check your permissions'
        result = 2
        if not os.path.isdir(storedir):
            raise
    except:
        result = 1
    return result


# Function for mysql backup
def mysql_backup(bases, user, passs, ocaldir4backups):
        try:
                starttime = time.time()
                for b in bases:
                        mb = subprocess.Popen(["time mysqldump -u "+user+" -p"+passs+" "+b+" | gzip > `date +"+storedir+"/"+"mysql-"+b+"-.sql.%Y%m%d.%H%M%S.gz`"], shell=True)
                time.sleep(2.0)
                mb.wait()
                endtime = time.time()
                print (u'Estimated time is: ')
                print endtime - starttime
                print (u'')
        except Exception as e:
                print ("Error with connection to database:")



if __name__ == '__main__':
        from optparse import OptionParser
        parser = OptionParser()

        parser.add_option("-a", "--address", dest="address", default=addr, help="ADDRESS for server", metavar="ADDRESS")

        parser.add_option("-p", "--port", dest="port", type="int", default=port, help="PORT for server", metavar="PORT")

        (options, args) = parser.parse_args()

        print ('')
        print ("Backup process launched at: "+ctime)
        print ('-----------------------------------------------------------------')
        check = check_server(options.address, options.port)

        print ('')

        check2 = check_server(mysqlhost, int(mysqlport))
        print ('')

        resret = check2+check

        print ('')

        if resret == 2:
            starttime = time.time()
            print ('Mysql working and remote backup server is accessible. Trying to mount remote share...')
            m = mountshare()
            if m == 0 or m == 32:
                    print ('Remote share mounted. Trying to create backups on local storage...')
                    ndr = newdir()
                    print ('Dump mysql databases...')
                    mysql_backup(bases, user=muser, passs=mpass, ocaldir4backups=localdir4backups)
                    print ('Backup directories...')
                    tardir(backupfolder)
                    print ("Backups has been made. Delete old archives, which older than "+keepdays+" days on local storage...")
                    odel = oldclear()
                    print ('Trying to sync...')
                    sn = sync()
                    print ('Unmount remote share...')
                    ut = unmount()
                    print ('DONE')
                    endtime = time.time()
                    print (u'Total time is (in minutes): ')
                    print (endtime - starttime)/60
                    print ('-----------------------------------------------------------------')
            else:
                    print ('Oops... I can not create archives on local storage and i can not sync')
                    print ('-----------------------------------------------------------------')


sys.exit()
Как запускать:

Ничего криминального в принципе нет - запихать в cron, если хотим регулярно его вызывать или же если хотим сами, то с команды скажем ./pubs-script.py... Вывод скрипта можно кстати перенаправить (скажем ./pubs-script.py >> /var/log/pubs.log).


P.S:
Перед тем как запустить скрипт, необходимо поправить переменные под Ваше хозяйство, которые расположены в самом начале программы после строчки # Variables section.

Что ещё можно сделать:

Возможно реализовать выгрузку данных на удалённый линуксовый сервер, необходимо поправить функцию и сделать право выбора (мол на какой тип сервера будем выгружать - линуксовый или виндушный).

среда, 17 октября 2012 г.

Настройка резервного копирования почти штатными средствами в Windows 2008 R2 server

Бэкапы Бэкапы Бэкапы...

На просторах Интернета есть масса всякого софта, предназначенного для резервного копирования. Проблема в том, что львиная часть этого добра либо стоит денег, либо пашет как то не так как тебе охота. Что у меня есть: Windows server 2008 R2 standart edition, на нём поднят контроллер домена и на нём же имеется расшаренная для всех директория - аля файловая помойка. Необходимо производить ежедневное полное резервное копирование этой директории. Сразу оговорюсь, что простое копирование я не хотел рассматривать, ибо не сжатые файлы занимают кучу пространства, так что будем рассматривать вариант с использованием какого либо архиватора.

Стратегия

Итак, необходимо иметь полные резервные копии файловой свалки за последние 7 дней. Каждая копия должна быть зажата каким либо архиватором. Резервная коипя не должна храниться на том же компьютере, на котором работает сама файловая свалка, так что будем бэкапить на одну из машинок, находящейся в локалке (машинка пашет на Windows 7 Professional).

Выбор архиватора

Немало важный вопрос... Почитав различную инфу по тем или иным архиваторам я нашёл вполне убедительные аргументы в пользу открытого кода (который раз... :)). Я остановил свой выбор на 7zip, т.к. он имеет более высокую скорость и степень сжатия (по этим ссылкам факты: http://habrahabr.ru/post/49343/ http://kikizas.net/en/apps.7z.html http://yes.km.ua/index.php?option=com_content&view=article&id=107:testing-the-archives-winrar-vs-7zip-vs-hao-zip&catid=37:computers-soft&Itemid=61 ).

Как будет работать?

Немного почитав за все возможности консольной версии 7zip и вооружившись относительным знанием написания обычных скриптов для Windows в стиле *.bat файлов я накатал необходимые скрипты и аккуратно их разместил в планировщиках заданий. Итак, для начала скачаем сам архиватор 7zip для своей платформы (судя по разрядности) с сайта http://www.7-zip.org/download.html , далее его установим. В директории с установленным архиватором есть груда файлов, я взял оттуда только 3 файла - 7z.dll, 7z.exe, 7-zip.dll и скопировал их в заранее созданую директорию c:\scripts. В этой же директории создадим BAT файл (в моём случае это backupshare.bat) с следующим содержимым:


@echo off
"C:\scripts\7z.exe" a \\PCPC\officesharebackup\backupshare_%date:~-10,2%%date:~-7,2%%date:~-4,4%.7z c:\share\

где - \\PCPC\ - машинка на которую будет складироваться создаваемый архив;
\\PCPC\officesharebackup - расшареная директория на удаленной машинке куда складируется архив;
c:\share\ - директория на сервере которую нужно нам бэкапить;

Далее открываем планировщик заданий на сервере (он же Task Scheduler, который можно успешно разыскать в панели управления) и создаём в нём обычное задание, в качестве исполняемого приложения подсовываем c:\scripts\backupshare.bat и назначаем его на выполнение скажем в полночь. После сохранения задания, откроем его свойства и укажем чтобы оно выполнялось вне зависимости от того залогинен пользователь или нет. Прям как тут:


При сохранении изменений в задании, может поклянчить пароль, ввести при необходимости.

Тест

Запустим задание на выполнение и убедимся что на удаленой машинке начал создаваться необходимый нам бэкап в формате backupshare_деньмесяцгод.7z.
Создался? Отлично!

Зачистка

Но мы теперь имеем проблему с тем, что архивы будут копиться на удаленом хранилище каждый день и их объём будет все расти и расти. Необходимо сделать зачистку старых копий (которые старше 7 дней). Для этого на удаленой машинке (как я выше сказал она стоит на Windows 7 professional) нам также надо будет накать скрипт и также разместить его в планировщике заданий удаленной машины. Для этого создадим в произвольном месте BAT (скажем c:\dataclear.bat) файл с следующим содержанием:

forfiles -p "D:\officesharebackup" -s -m *.7z -d -7 -c "cmd /c del @PATH"

Я буду производить зачистку старых копий скажем в 8 утра (это дело остается на усмотрение творца и дирижера системы). Также как и на сервере так и на удаленой машинке в планировщик заданий толкаем на выполнение этот скрипт по тому же принципу что и на сервере. Проверяем... И у нас в действительности остаётся лишь 7 резервных копий за последние 7 дней как мы и заказывали.

Итог

Система пашет, я доволен, ни одного цента никому не заплачено. Я не рассмотрел здесь все возможности архиватора 7zip и не рассмотрел возможности в плане задачи каких то отдельных параметров при создании резервных копий, дополнительную документацию можно найти на сайтах разработчиков тех или инах программных продуктов. Ну а так в перспективе думаю ещё организовать отсылку уведомлений на почту при тех или иных событиях и в принципе мне этого будет достаточно.