2

grep を使用して mysql ダンプからテーブルを抽出するこのガイドに従っていたので、1 つのテーブルを覗くために 50GB のデータすべてを復元する必要はありません。テーブルをプルする 2 つの主なコマンドは次のとおりです。

 grep -n "Table structure" [MySQL_dump_filename].sql

テーブル定義の行番号を取得し、次に

 sed -n '[starting_line_number],[ending_line_number] p' [MySQL_dump_filename].sql > [table_output_filename].sql

ただし、.sql ダンプを逆の順序で検索したいと思います。必要なのはファイルの末尾にあり、最初の 48 GB のデータを grep するのにかなりの時間がかかるからです。私はOS Xを使用しており、tacをインストールしています(ここに記載されているようにbrewを介して)。しかし、これを達成するためにコマンドをセットアップし、sed が必要な行を取得した後にコマンドを終了させることは可能ですか? そうでない場合は、最初から tac をまったく実行せずに grep した方がよいので、しばらくお待ちください。または、ファイルが別の端末に取り込まれているのを確認したら、ctrl-c を押します。

実行例:

$ tac dump.sql | grep -n "Table structure"
...
751:-- Table structure for table `answer`
779:-- Table structure for table `template`
806:-- Table structure for table `resource`
...

しかし、もちろんこれらは行番号が逆なので、「テンプレート」テーブルが必要な場合は sed -n '752,779 p' を実行する必要がありますが、ファイルの最後からそうしないと、間違った行番号 (sedファイルの先頭からカウントされます)。

4

2 に答える 2

1

いくつかの簡単な指針:

  • dd最初の N GB が役に立たないことが確実な場合は、非常に高速な N バイト/ブロック/何でもスキップするのに役立ちます

  • スキップした後、1)grep行番号を見つけてから2)sed行番号nまでスキップする必要はありません(残りの巨大な2倍を読み取ります):直接:

    awk '/beginningpattern/,/endpattern/ { print $0 ; }'#warning: 構文が不完全です。awk とその優れた点についてよく読んでください。あらゆる種類のきちんとしたことができます。

于 2013-01-08T18:22:20.550 に答える
0

すべてのテーブル定義の始まりと終わりを知るためのより効率的な方法を次に示します。

特定のファイルに対してrolando.sql、次のことを行うスクリプトを作成します。

DAT=rolando.sql
TBLMAP=tblmap.txt
TBLLST=${TBLLST}.lst
TBLTMP=${TBLMAP}.tmp
RUNMAP=DisplayTables.sh
grep -n "^-- Table structure" ${DAT} |sed 's/:/ /'| awk '{print $1}'  > ${TBLTMP}
grep -n "^) ENGINE="          ${DAT} |sed 's/:/ /'| awk '{print $1}' >> ${TBLTMP}
sort -n < ${TBLTMP} > ${TBLLST}
rm -f ${TBLTMP}
rm -f ${TBLMAP}
POS=1
for X in `cat ${TBLLST}`
do
    (( POS = 1 - POS ))
    if [ ${POS} -eq 0 ]
    then
        (( Y = X - 2 ))
    fi
    if [ ${POS} -eq 1 ]
    then
        echo "${Y},${X}" >> ${TBLMAP}
    fi
done
rm -f ${TBLLST}
echo "Table Structures From ${DAT}"
for XY in `cat ${TBLMAP}`
do
    echo "sed -n '${XY}p' ${DAT}" >> ${RUNMAP}
done
chmod +x ${RUNMAP}
./${RUNMAP}

このスクリプトは、すべての create table ステートメントを出力します。DROP TABLEステートメントも含まれます。drop table ステートメントが必要ない場合は、次のようにします。

DAT=rolando.sql
TBLMAP=tblmap.txt
TBLLST=${TBLLST}.lst
TBLTMP=${TBLMAP}.tmp
RUNMAP=DisplayTables.sh
grep -n "^CREATE TABLE" ${DAT} | sed 's/:/ /' | awk '{print $1}'  > ${TBLTMP}
grep -n "^) ENGINE="    ${DAT} | sed 's/:/ /' | awk '{print $1}' >> ${TBLTMP}
sort -n < ${TBLTMP} > ${TBLLST}
rm -f ${TBLTMP}
rm -f ${TBLMAP}
POS=1
for X in `cat ${TBLLST}`
do
    (( POS = 1 - POS ))
    if [ ${POS} -eq 0 ]
    then
        (( Y = X ))
    fi
    if [ ${POS} -eq 1 ]
    then
        echo "${Y},${X}" >> ${TBLMAP}
    fi
done
rm -f ${TBLLST}
echo echo "Table Structures From ${DAT}" > ${RUNMAP}
for XY in `cat ${TBLMAP}`
do
    echo "sed -n '${XY}p' ${DAT}" >> ${RUNMAP}
done
chmod +x ${RUNMAP}
./${RUNMAP}

試してみる !!!

于 2013-01-08T18:54:00.883 に答える