2009-04-03 4 views
0

テーブルがメモリエンジンによって実行されるようにMySQLデータベースを設定しようとしています。私は大量データが失われるのを気にしませんが、毎日(cronjobのmysqldump経由で)ダンプして、initファイルをこのダンプに設定したいと思います。しかし、私はmysqldumpをどのようにしてinit-fileがSQL文をどのようにフォーマットしたいのかを理解することができません。MySQLのメモリエンジン+ initファイル

私はちょうどこの方法でデータベースを設定しようとする完全な明白な何かを欠いていますか?

答えて

2

MySQLダンプは、MySQLデータベースの内容をSQLとしてダンプします。したがって、これをデータベースファイルとして直接読み取る方法はありません。

あなたができることは、MySQLが起動するたびに(コマンドラインで)最後のダンプを自動的にロードするようにMySQL用のinitスクリプトを変更することです。

さらに良い解決策は、RAMディスクを使用してデータベースの内容全体をメモリに保持し、定期的にこれをバックアップとして安全な場所にコピーすることです。

データベースの内容をまったく維持したい場合は、ディスクベースのストレージエンジン(InnoDBまたはMyISAM)を使用するだけで、サーバーに多くのRAMを与えてキャッシュとして使用します。

0

私の理解では、--init-fileはそれぞれのSQL文が1行で出力されることを期待していますが、ファイルにはコメントはありません。

あなたがして、コメントをクリアすることができるはずです:1本のライン上の各SQL文のよう

mysqldump --comments=false 

、私はそれをするのmysqldumpのオプションに慣れていないんだけど、何を行うことができますすることです改行の全てを除去するためにはPerlのライン:

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

--init-fileがそれを好きかどうかは分かりませんが、それは試してみる価値です。

また、通常のmysqldumpファイルに読み込まれたスクリプトからmysqlを起動することもできます。あなたが探していた解決策ではありませんが、それはあなたの後の効果を達成するかもしれません。

0

私はこれに遭遇したので、私が何をしているか教えてあげます。まず、メモリテーブルにip-> country dbがあります。それを "保存"しようとする理由はなく、簡単かつ定期的に削除して再作成しますが、PHPが欠落した場合にはどのように動作し、毎週更新される予定ですか?第二に、私は他のメモリテーブルの束を持っています。ライフスパンを数分で、より揮発性があるので、これらを保存する理由はありません。それらは非常に迅速にリフレッシュされますが、失効したデータは、まったく更新されないデータよりも優れています。また、別のキーキャッシュを使用している場合は、最初にロードする必要があります(ロードすることができない場合があります)。最後に、データベースの起動時にデータベースを開くための他のインターフェース(mysqlクライアントなど)がないので、完全なデータベースを餃子していない場合は、そこに「use」ステートメントを入れてください。

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

mysqldump --comments=false -udrinkin [email protected] 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、それは私のために働く。

1

このsolutionは大体ですが、テーブルデータの文字列値にセミコロンが含まれていると問題が発生します。すべてが改行文字で置き換えられます。ここで

は、私がこれを実装する方法です:

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