2010-07-30

Автоматический backup базы MSSQL

Дано: некая база данных на сервере MSSQL 2005 Express.
Нужно: производить резервное копирование БД одним кликом или даже вообще без клика, автоматически.
Насколько я знаю, в полной версии (не Express) есть готовые инструменты для этого, и очень неплохие. Но она платная. Поэтому будем обходиться тем, что есть. И у нас получится.

Итак, резервное копирование, как и многое другое, может выполняться путем запроса T-SQL. Как узнать, как выглядит такой запрос? Можно, конечно погуглить, и вгрызаться в документацию, но есть способ проще. Кто не знал - сейчас покажу.
Запускаем SQL Server Management Studio Express. Выбираем свою базу и...



Все, теперь у нас есть sql-файл с готовым сценарием, делающим backup. Назовем его, к примеру, mssql_backup.sql, и положим на диск D.
Теперь осталось его запустить извне. Для этого есть консольная утилита sqlcmd, которая входит в состав сервера (респект парням из MS!). Пользоваться так:

sqlcmd -S .\SQLEXPRESS -i "d:\mssql_backup.sql"
где -S .\SQLEXPRESS - указание на имя сервера, по умолчанию оно такое.
Создаем bat-файл с этой командой, запускаем, наблюдаем процесс. Красота!

Осталось пара моментов.
1) Как сделать, чтобы это происходило по расписанию? Cron тут нету, есть планировщик заданий, но в моем XP он не пожелал сохранять задание в расписании, ругался на отсутствие прав... Погуглив, я узнал, что это баг и чинить его, видимо, уже не будут.
Поэтому, не заморачиваясь, кинул скрипт в автозапуск. Комп включается ежедневно, так что бэкап каждое утро меня вполне устраивает.
2) Как сделать, чтобы файл резервной копии не перезаписывался каждый раз? Хотелось бы, чтобы имя файла говорило мне, от какого числа эта копия.
Что ж, невозможного нет: правим сохраненный ранее сценарий:

DECLARE @filedate VARCHAR(20)
SET @filedate=REPLACE(REPLACE(CONVERT(VARCHAR(20),GETDATE(),20),':','.'),' ','_')

DECLARE @file_path VARCHAR(256)
SET @file_path='D:\MSSQL_DataBases\main_'+@filedate+'.bak'

BACKUP DATABASE [main] TO  DISK = @file_path WITH NOFORMAT, INIT,  NAME = N'main-Полная База данных Резервное копирование', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

Теперь файлы будут выглядеть как main_2010-07-30_09.14.19.bak, что нам и требовалось. Можно дописать в bat-файл команду для их копирования куда-нибудь еще, например в сеть. Для надежности.
Ясное дело, что ни о каких наворотах или вопросах безопасности тут речи нет. Я просто показал пример, как это можно сделать.

2010-07-12

Управление сервисами Google из командной строки

Случайно узнал, что есть и такое. Так что запишу себе на заметку и вам на радость! По-моему, очень интересно, особенно для автоматизации-скриптизации своего компьютерного хозяйства.

Проект GoogleCL

2010-07-01

Чистим MKV-файлы от ненужных треков

Имеем: кучу файлов MKV (типа file-01.mkv, file-02.mkv ... file-24.mkv), в каждом из которых множество треков (видео, аудио, субтитры).
Нужно: оставить в них только одну видео- и одну звуковую дорожку.

Для работы с MKV нам понадобится одна утилита: mkvtoolnix
sudo apt-get install mkvtoolnix

Чтобы посмотреть, какие треки есть в файле, сделаем так:
mkvinfo file-01.mkv

Получаем довольно полную картину состава файла. Но нам нужна только часть, поэтому отфильтруем ненужное:
mkvinfo file-01.mkv | grep -Gi 'A track\|track number\|track type\|codec id\|Language'

| + A track
|  + Track number: 1
|  + Track type: video
|  + Codec ID: V_MPEG4/ISO/AVC
|  + Language: und
| + A track
|  + Track number: 2
|  + Track type: audio
|  + Codec ID: A_AAC
|  + Language: rus
| + A track
|  + Track number: 3
|  + Track type: audio
|  + Codec ID: A_AAC
|  + Language: jpn
| + A track
|  + Track number: 4
|  + Track type: subtitles
|  + Codec ID: S_TEXT/ASS
|  + Language: rus

Запоминаем номера нужных треков и их содержимое. Например, мне нужны только первый и третий трек. Берем их из исходного файла и создаем новый, содержащий только эти два трека:
mkvmerge file-01.mkv --vtracks 1 --atracks 3 -o file-01_.mkv
Если в файле только один видеотрек (как обычно и бывает), то достаточно и этого:
mkvmerge file-01.mkv -a 3 -o file-01_.mkv
Если субтитры тоже нужно включить, то
mkvmerge file-01.mkv -a 3 --stracks 4 -o file-01_.mkv

Ну а теперь, для пробы создадим копии первых пяти файлов, но только с нужными нам 1 и 3 треками:
for i in *{01..05}.mkv; do mkvmerge "$i" -a 3 -o "${i%.mkv}_.mkv"; done

Все получилось? Тогда можно и остальные обработать.

P.S. На всякий случай, если вы хотите вытащить оттуда субтитры в отдельный файл, то никто вам не мешает. К примеру, так:
mkvextract tracks file-01.mkv -c UTF-8 4:file-01.ass

2010-06-28

Видео для android

Устройства на базе Google Android воспроизводят видео определенного формата (mp4). Чтобы сжать кино для просмотра можно использовать ffmpeg, собранный с кодеком x264.

К примеру, такой скрипт в арсенале андроидовода может прижиться. Назовем его android.sh, сделаем исполняемым и положим в какую-нибудь папку, проходящую по данным PATH.



Теперь сжатие файла выполняется командой:
android.sh FileName
или, если нужно выбрать звуковую дорожку
android.sh FileName 1

Пока что мне не попадалось видео, которые бы конвертировались криво. Ура ffmpeg-у.

А как быть с субтитрами?

Единственный плейер, который умеет играть видео с субтитрами (из тех, что мне известны) - mVideoPlayer (даже умеет их сдвигать на указанное кол-во миллисекунд в обе стороны). Единственный тип субтитров, которые он кушает - SRT. Соответственно, в кодировке UTF-8.
Значит, нужно конвертировать субтитры из других форматов. Специальные программы есть в репозитариях, но уже на третьем файле линуксоид подумает: а нельзя ли как-то это автоматизировать? Я искал что-нибудь консольное, и не нашел.
Пришлось, как всегда, брать python в руки. Пока что соорудил конвертировщик ASS в SRT, понадобится другой формат переводить - думаю, и с ним проблем не будет. На выходе отдает файл в исходной кодировке. Вот что получилось на скорую руку (создайте файл подобный предыдущему, например subconv.py)



Теперь файл конвертирую так:
subconv.py -f FileSub.ass
и создается FileSub.srt в той-же папке.
Для конвертирования пачки использую цикл:
for i in *.ass; do subconv.py -f "$i"; done

P.S. Буквально вчера было обновление mVideoPlayer, в котором добавилась поддержка субтитров SSA и ASS. Теперь стало еще легче.

Сборка свежего ffmpeg

Заметка на память. Сборка свежего ffmpeg с кодеком x264. Взято здесь.

sudo apt-get install subversion
mkdir ~/src
cd ~/src
svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg
sudo apt-get install checkinstall
sudo apt-get install libfaac-dev libfaad-dev libmp3lame-dev \
libtheora-dev libxvidcore-dev libvorbis-dev libogg-dev libdirac-dev \
libopenjpeg-dev libschroedinger-dev libspeex-dev libgsm1-dev yasm \
libopencore-amrnb-dev libopencore-amrwb-dev libdc1394-22-dev
sudo apt-get install git-core
git clone git://git.videolan.org/x264.git
cd x264
./configure
make
sudo checkinstall --fstrans=no --install=yes --pkgname=x264 \
--pkgversion "1:0.svn`date +%Y%m%d`-0.0ubuntu1" --default
sudo ./configure --enable-gpl --enable-nonfree --enable-pthreads \
--enable-libfaac --enable-libfaad --enable-libmp3lame --enable-libtheora \
--enable-libx264 --enable-libxvid --enable-x11grab --enable-libdirac \
--enable-libopenjpeg --enable-libschroedinger --enable-libspeex \
--enable-libgsm --enable-libvorbis --enable-libopencore-amrnb \
--enable-libopencore-amrwb --enable-libdc1394 --enable-version3
sudo make
sudo checkinstall --fstrans=no --install=yes --pkgname=ffmpeg \
--pkgversion "3:0.svn`date +%Y%m%d` -12ubuntu3" --default
P.S. Если процессе сборки ffmpeg пишет так

.../libavcodec.so: undefined reference to `x264_encoder_open_94'
collect2: ld returned 1 exit status
make: *** [ffmpeg_g] Ошибка 1
возможно установлены лишние пакеты:

sudo apt-get purge x264 libx264-dev