MySQL Memory engine + init-файл - PullRequest
0 голосов
/ 04 апреля 2009

Я пытаюсь настроить базу данных MySQL, чтобы таблицы управлялись механизмом памяти. Меня не волнует потеря некоторых данных, которые заполняются, но я хотел бы делать их ежедневно (через mysqldump в cronjob) и установить для init-file этот дамп. Однако я не могу понять, как заставить mysqldump быть совместимым с тем, как init-файл хочет, чтобы операторы SQL были отформатированы.

Я просто упускаю что-то совершенно очевидное, пытаясь настроить базу данных таким образом?

Ответы [ 4 ]

2 голосов
/ 04 апреля 2009

Дампы MySQL - это как раз дампы содержимого базы данных MySQL как SQL. Таким образом, нет никакого способа прочитать это непосредственно как файл базы данных.

Что вы можете сделать, это изменить скрипт инициализации MySQL для автоматической загрузки последнего дампа (через командную строку) при каждом запуске MySQL.

Еще лучшим решением было бы использовать виртуальный диск для хранения всего содержимого вашей базы данных в памяти, а затем периодически копировать его в безопасное место в качестве резервной копии.

Хотя, если вы хотите вообще поддерживать содержимое ваших баз данных, вам лучше всего использовать один из дисковых механизмов хранения (InnoDB или MyISAM) и просто дать вашему серверу много оперативной памяти для использования как кеш.

1 голос
/ 12 января 2012

Это решение почти великолепно, но вызывает проблемы, когда строковые значения в табличных данных содержат точки с запятой - все они заменяются символом новой строки.

Вот как я это реализовал:

    mysqldump --comments=false --opt dbname Table1 Table2 > /var/lib/mysql/mem_tables_init.tmp1
    #Format dump file - each statement into single line; semicolons in table data are preserved
            grep -v -- ^-- /var/lib/mysql/mem_tables_init.tmp1 | sed ':a;N;$!ba;s/\n/THISISUNIQUESTRING/g' | sed -e 's/;THISISUNIQUESTRING/;\n/g' | sed -e 's/THISISUNIQUESTRING//g' > /var/lib/mysql/mem_tables_init.tmp2

    #Add "USE database_name" instruction
    cat /var/lib/mysql/mem_tables_init.tmp2 |sed -e 's/DROP\ TABLE/USE\ `dbname`;\nDROP\ TABLE/' > /var/lib/mysql/mem_tables_init.sql

    #Cleanup
    rm -f /var/lib/mysql/mem_tables_init.tmp1 /var/lib/mysql/mem_tables_init.tmp2
0 голосов
/ 21 сентября 2009

Я наткнулся на это, поэтому я скажу вам, что я делаю. Во-первых, у меня есть таблица ip-> country в таблице памяти. Нет никаких оснований пытаться «сохранить» его, его легко и регулярно удаляют и воссоздают, но может быть непредсказуемым, как будет действовать php, когда его пропадает и его обновление планируется только еженедельно. Во-вторых, у меня есть куча других таблиц памяти. Нет причин сохранять их, поскольку они еще более изменчивы, а продолжительность жизни составляет несколько минут. Они будут обновляться очень быстро, но устаревшие данные лучше, чем вообще ничего. Кроме того, если вы используете какие-либо отдельные кеши ключей, их (в некоторых случаях) может потребоваться сначала загрузить, иначе вы не сможете их загрузить. И, наконец, обязательно добавьте туда выражение «use», если вы не производите сброс полных баз данных, так как нет другого интерфейса (например, клиента mysql) для открытия базы данных при запуске .. Итак ..

cat << EOF > /var/lib/mysql/initial_load.tmp
use fieldsave_db;                 
cache index fieldsave_db.search in search_cache;
EOF

mysqldump --comments=false -udrinkin -pbeer@  fieldsave_db ip2c \
    >> /var/lib/mysql/initial_load.tmp                  
mysqldump --comments=false -ufields -pavenue  -B memtables \
    >> /var/lib/mysql/initial_load.tmp

grep -v -- ^-- /var/lib/mysql/initial_load.tmp |tr -d '\012' \
   |sed -e 's/;/;\n/g' > /var/lib/mysql/initial_load.sql

Как всегда, YMMV, но у меня это работает.

0 голосов
/ 04 апреля 2009

Насколько я понимаю, --init-файл ожидает каждого оператора SQL в одной строке и что в файле нет комментариев.

Вы должны быть в состоянии очистить комментарии с помощью:

mysqldump --comments=false

Что касается каждого оператора SQL в одной строке, я не знаком с параметром mysqldump, чтобы сделать это, но вы можете использовать строку Perl для удаления всех новых строк:

perl -pi -w -e 's/\n//g;' theDumpFilename

Не знаю, понравится ли --init-file или нет, но стоит попробовать.

Другая вещь, которую вы можете сделать, это запустить mysql из скрипта, который также загружается в обычный файл mysqldump. Не то решение, которое вы искали, но оно может достичь желаемого эффекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...