Для Innodb вы можете просто добавить CONFIG_mysql_dump_single_transaction = 'yes' в свой файл conf.
Для механизма MyISAM вам нужно будет добавить --skip-add-locks в файл automysqlbackup. найдите функцию parse_configuration и добавьте значение массива, как указано ниже.
Я убедился, что он отлично работает.
Измените
parse_configuration () { # OPT string for use with mysqldump ( see man mysqldump ) opt=( '--quote-names' '--opt')
на
parse_configuration () { # OPT string for use with mysqldump ( see man mysqldump ) opt=( '--quote-names' '--opt' '--skip-add-locks' '--skip-add-drop-table')
declare -A properties
function readPopertyFile
{
while read line || [[ -n $line ]]; do
key=`echo $line | cut -s -d'=' -f1`
if [ -n "$key" ]; then
value=`echo $line | cut -d'=' -f2-`
properties["$key"]="$value"
fi
done < $1
}
Использование:
readPopertyFile "file.properties"
Считывает свойства в переменную ассоциативного массива с именем properties
.
* Работает в bash. Не знаю про другие снаряды.
* Не обрабатывает многострочные свойства.
Для наиболее распространенного подмножества этого формата данных можно использовать короткую функцию, используя расширение переменных bash и regexp-сопоставление.
Примечание: Эта функция ожидает, что строки будут в формате ^key = value$
, или ^#.*$
и ^!.*$
для комментариев. Адаптируйте код или обработайте данные иначе
$ cat /tmp/propdata
k1 = v1
# A comment
k2 = v2and some s=t=u=f=f
! Another comment
k3 = v3
$ unset DATA
$ declare -A DATA
$ props(){ while read line || [[ -n $line ]]; do
[[ "$line" =~ ^#|^! ]] && continue;
if [[ "${line% =*}" ]]; then DATA[${line% =*}]="${line#*= }" ; fi ;
done < $1 ; }
$ props /tmp/propdata
$ echo "${DATA[k3]}"
v3
$ echo "${DATA[k2]}"
v2and some s=t=u=f=f
Edit: Обновлено для обрезания пробелов вокруг "=" для ключа и значения
Edit2: Теперь фильтрует и комментарии.
Используйте настоящий синтаксический анализатор, такой как perl
модуль Config :: Properties
. Я бы написал весь сценарий на perl
, но если вам нужно использовать bash
, вы можете сделать что-то вроде:
typeset -A props
while IFS= read -rd '' key && IFS= read -rd '' value; do
props[$key]=$value
done < <(
perl -MConfig::Properties -l0 -e '
$p = Config::Properties->new();
$p->load(STDIN);
print for $p->properties' < file.properties
)
(также работает с zsh
) .
Реализация полного синтаксического анализатора в bash
потребует много работы и потребует повторного изобретения колеса. Вы можете реализовать хорошее подмножество с помощью простого цикла while read
, хотя, поскольку встроенная функция read
ожидает входной формат, очень похожий на эти файлы свойств:
typeset -A props
while IFS=$':= \t' read key value; do
[[ $key = [#!]* ]] || [[ $key = "" ]] || props[$key]=$value
done < file.properties
(также работает с ksh93
и zsh
, две другие борноподобные оболочки, поддерживающие ассоциативные массивы).
Это обрабатывает:
prop = value
prop: value
prop value
!
и #
с необязательные начальные пробелы) foo \: \: bar = value
для ключей, содержащих разделители, либо foo = \ bar
или пароль_с \\ обратной косой чертой) -и = равно
в вашем примере). Однако, если мы проверим соответствие спецификации
\ n
, \ r
, \ uXXXX
... последовательности $ IFS
, поскольку \ f
не является символом пробела IFS). foo: bar =
, который сохраняет bar
в $ {props [foo]}
вместо bar =
] ( foo: bar: baz:
все же в порядке). Это проблема только в том случае, если значение свойства содержит один (неэкранированный) разделитель (:
, необязательно окруженный символами SPC / TAB, =
, необязательно окруженный символами SPC / TAB или последовательность из одного или более символов SPC / TAB) и находится в конце. \!
или \ #
. Проблема только в свойствах, имя которых начинается с !
или #
. в
prop = 1 \ {1}} 2 \
3
мы получаем 1 2 3
вместо 123
: начальные пробелы в строках продолжения не игнорируются, как и должно быть.
Вот руководство по Bash4+
#!/usr/bin/env bash
declare -A properties
# Read with:
# IFS (Field Separator) =
# -d (Record separator) newline
# first field before separator as k (key)
# second field after separator and reminder of record as v (value)
while IFS='=' read -d $'\n' -r k v; do
# Skip lines starting with sharp
# or lines containing only space or empty lines
[[ "$k" =~ ^([[:space:]]*|[[:space:]]*#.*)$ ]] && continue
# Store key value into assoc array
properties[$k]="$v"
# stdin the properties file
done < file.properties
# display the array for testing
typeset -p properties
file.properties
:
# comment
a=value-a
b=http://prefix.suffix:8080/?key=value
c=password_with\\backslash-and=equals
d e=the d e value
# comment
Вывод этого скрипта из предоставленной выборки данных:
declare -A properties=(["d e"]="the d e value" [c]="password_with\\\\backslash-and=equals" [b]="http://prefix.suffix:8080/?key=value" [a]="value-a" )