質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

エックスサーバーでエラーログがテラバイト単位で蓄積される原因の解明

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,983

ssmxgo

score 168

掲題の通り、素人がシェルで動くMySQLをアプリケーションに組み込んでしまったため、共有サーバで多大な迷惑をかけてしまいました。色々お叱りがあると思いますが何卒お手柔らかにお願い致します。

まず、細かい経緯はさておき、シンプルにシェルからのMySQLコマンドに問題はあるでしょうか?これがわかれば以下の詳細は目を通す必要がないかもしれません

    mysql -h${DB_HOST} -u${DB_USER} -p${DB_PASS} ${IM_DB_NAME} < $(cd $(dirname $0) && pwd)/db.dump

db.dump は以下の出力結果です。データベースの中身はワードプレス本体です。

    mysqldump --single-transaction -h${DB_HOST} -u${DB_USER} -p${DB_PASS} ${EX_DB_NAME} > $(cd $(dirname $0) && pwd)/db.dump

そもそもSQLの素人が、ネットを検索しながら書いたものなので色々と不理解がありますがよろしくお願いします

一番心配なのはエクスポートした際のデータベース名、ホスト名と、インポート先のデータベース名、ホスト名が違います。特にdb.dumpを編集はせず、上記のコードのみ実行しました。

これは phpMyAdmin にてdb.dump を手動でインポートする際に特に中身を編集せずに違うデーターベース名、違うホスト名にそのまま取り込めたことに起因します。

追記です

  7 if [ ! $1 ]; then
  8         while [ ! $EX_DB_NAME ]
  9         do
 10                 echo "元データベース名を入力してください"
 11                 read EX_DB_NAME
 12         done
 13 else
 14         #引数1番めの指定を反映
 15         EX_DB_NAME=$1
 16 fi


に対して以下の指摘も受けました

>>> ▼下記のエラーが多数出力されておりました
>>> --------------------------------------------------
>>> /home/xaccount/mydomain.com/public_html/shell/db_exp.sh: line 11: read: read error: 0: Invalid argument
>>> /home/xaccount/mydomain.com/public_html/shell/db_exp.sh: line 11: read: read error: 0: Invalid argument

追記2

#!/bin/sh
#オリジナル=>テスト環境コピー
DB_USER=xxxx
DB_PASS=xxxx
DB_HOST_DEF=mysqlxxxx.xsrv.jp
DOMAIN=mydomain.com

if [ ! $1 ]; then
    echo "元データベース名を入力してください"
    read EX_DB_NAE
    TEMP=${EX_DB_NAME:=def_db_name}
else
    #引数1番めの指定を反映
    EX_DB_NAME=$1;
fi
#echo $EX_DB_NAME

if [ ! $2 ]; then
    while [ ! $IM_DB_NAME ]
    do
        echo "送り先データベース名を入力してください"
        read IM_DB_NAME
    done
else
    #引数2番めの指定を反映
    IM_DB_NAME=$2;
fi
#echo $IM_DB_NAME

if [ ! $3 ]; then
    while [ ! $SUBDOMAIN ]
    do
        echo "インストール先のサブドメイン(ディレクトリ名)を入力してください"
        read SUBDOMAIN
    done
else
    #引数3番めの指定を反映
    SUBDOMAIN=$3;
fi
#echo $SUBDOMAIN

if [ ! $4 ]; then
    echo "データベースホストを入力してください(デフォルト: ${DB_HOST_DEF})"
    read DB_HOST
    TEMP=${DB_HOST:=$4}
    TEMP=${DB_HOST:=${DB_HOST_DEF}}
else
    #引数4番めの指定を反映
    DB_HOST=$4;
fi
#echo $DB_HOST

if [ ! $5 ]; then
    echo "カスタマIDをを入力してください(デフォルト: null)"
    read HID
    TEMP=${HID:=$5}
    TEMP=${HID:=NULL}
else
    #引数4番めの指定を反映
HID=$5;
fi
#echo $HID

echo "●設定"

#dev db->export
echo "DB->export ${EX_DB_NAME}"
mysqldump --single-transaction -h${DB_HOST} -u${DB_USER} -p${DB_PASS} ${EX_DB_NAME} > $(cd $(dirname $0) && pwd)/db.dump

#new db<-import
echo "DB<-import ${IM_DB_NAME}"
mysql -h${DB_HOST} -u${DB_USER} -p${DB_PASS} ${IM_DB_NAME} < $(cd $(dirname $0) && pwd)/db.dump

#set wp-options
echo "Wordpress setting... ${IM_DB_NAME}"
mysql -h${DB_HOST} -u${DB_USER} -p${DB_PASS} ${IM_DB_NAME} -e "UPDATE wp_options SET option_value='http://${SUBDOMAIN}.${DOMAIN}/wp' WHERE option_name='siteurl';"
mysql -h${DB_HOST} -u${DB_USER} -p${DB_PASS} ${IM_DB_NAME} -e "UPDATE wp_options SET option_value='http://${SUBDOMAIN}.${DOMAIN}' WHERE option_name='home';"

#wordpress config
echo "Wordpress setting... "
cat $(cd $(dirname $0) && pwd)/../wp/wp-config-base.php | sed -e "s/database_name_here/${IM_DB_NAME}/g" | sed -e "s/localhost/${DB_HOST}/g" > /home/xaccount/${DOMAIN}
/public_html/${SUBDOMAIN}/wp/wp-config.php


echo "スクリプト終了"

これらがとんでもない量のエラーログを吐き出す原因になるのでしょうか?今はエックスサーバーのアカウントログインを制限されログを確認することができません

以下、詳細です


 経緯

当初は表面上は問題もなく動いていたのですが、エックスサーバーからエラーログが大量に作成されサーバー負荷が高いと指摘される。
『ページリダイレクト問題絡みでシェルが何度も走ってしまった』と思い、リダイレクトの懸念があった場所を回避させる形で、『直りました報告』し、制限解除されてからの再度の過負荷で当然のアカウント制限までかけられてしまいました。

しがない考察

個人的に結論として、数百GB〜数TBのログ(にわかには信じられなかった)が一般公開していないページのリダイレクト不具合で貯まるとも考え難く、シェルの書き方、MySQLの理解に問題があったのではないかと思い問題解決の手がかりのご教授いただきたく書き込ませていただきました。

追記
シェルに while文が使われてますねぇ。こいつがタイムアウトせず延々と走り続けるということはあるのでしょうか。ここも改めて見直してみます

 アプリケーションの仕様

エックスサーバーでの運用
(今になって失敗したなと思っていますが、未公開サイトでしたのでエックスサーバーで直接開発。ローカル環境ではテストしていません → この状況になり今環境を作っている最中)

構成
アプリケーションはワードプレスと、自作の管理ツールで形成されます。
雛形ワードプレスサイトの複製し量産、量産した個々のサイトをワードプレス管理画面からカスタマイズした後、ワードプレスのデータベースをダンプし、サイトの全ファイルと共に圧縮。
別途契約されたエックスサーバー内で解凍しデータベースをインポートしカスタマイズされた量産ワードプレスサイトの設置完了。

 問題部分

①~③のタイミングでシェル側から発行したMySQL自体に問題がある?と考え、数GB~数TBまでエラーを吐き出してしまう問題があればご指摘をお願いします

①雛形ワードプレスサイトの量産(カスタマイズ用)

    #雛形ワードプレス用データベースのエクスポート
    mysqldump --single-transaction -h${DB_HOST} -u${DB_USER} -p${DB_PASS} ${EX_DB_NAME} > $(cd $(dirname $0) && pwd)/db.dump

    #カスタマイズ用量産ワードプレスのデータベースへのインポート(これが怪しい)
    mysql -h${DB_HOST} -u${DB_USER} -p${DB_PASS} ${IM_DB_NAME} < $(cd $(dirname $0) && pwd)/db.dump

    #カスタマイズ用量産ワードプレスのデータベースの設定値の変更
    mysql -h${DB_HOST} -u${DB_USER} -p${DB_PASS} ${IM_DB_NAME} -e "UPDATE wp_options SET option_value='http://${DOMAIN}/wp' WHERE option_name='siteurl';"
    mysql -h${DB_HOST} -u${DB_USER} -p${DB_PASS} ${IM_DB_NAME} -e "UPDATE wp_options SET option_value='http://${DOMAIN}' WHERE option_name='home';"


②量産されたカスタマイズ用ワードプレスサイトのエクスポート

    #カスタマイズ用量産ワードプレスのデータベースのエクスポート
    mysqldump --single-transaction -h${DB_HOST} -u${DB_USER} -p${DB_PASS} ${EX_DB_NAME} > $(cd $(dirname $0) && pwd)/db.dump


③カスタマイズされた量産ワードプレスを別サーバーに設置

    #設置用量産ワードプレスのデータベースへのインポート(これが怪しい)
    mysql -h${DB_HOST} -u${DB_USER} -p${DB_PASS} ${IM_DB_NAME} < $(cd $(dirname $0) && pwd)/db.dump

    #量産ワードプレス用データベースの設定値の変更
    mysql -h${DB_HOST} -u${DB_USER} -p${DB_PASS} ${IM_DB_NAME} -e "UPDATE wp_options SET option_value='http://${DOMAIN}/wp' WHERE option_name='siteurl';"
    mysql -h${DB_HOST} -u${DB_USER} -p${DB_PASS} ${IM_DB_NAME} -e "UPDATE wp_options SET option_value='http://${DOMAIN}' WHERE option_name='home';"


ただし、②、③は①に踏襲するので、①のみをチェックしていただけることで解決できることと思います。

以上、問題の解決の緒がわかる方がいらっしゃいましたらご教授お願いします

 補足

後ほど、ローカル環境でログを取ることができましたらログを書き込む予定です。
→エラーというほどの内容は吐かれず正常にインポートできているような…

 補足2

エックスサーバーからの指摘のエラー内容は以下

>>> ▼下記のエラーが多数出力されておりました
>>> --------------------------------------------------
>>> /home/xaccount/mydomain.com/public_html/shell/db_exp.sh: line 11: read: read error: 0: Invalid argument
>>> /home/xaccount/mydomain.com/public_html/shell/db_exp.sh: line 11: read: read error: 0: Invalid argument

その部分のコードは以下です。ここは直接SQLとは関係ないところです

  7 if [ ! $1 ]; then
  8         while [ ! $EX_DB_NAME ]
  9         do
 10                 echo "元データベース名を入力してください"
 11                 read EX_DB_NAME
 12         done
 13 else
 14         #引数1番めの指定を反映
 15         EX_DB_NAME=$1
 16 fi

なんか、ここでGBクラスのログが吐かれるとは思ってもいなかったのですが、よく見たらwhile文が使われてますねぇ(汗)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ssmxgo

    2017/01/03 10:48

    ありがとうございました。シェルスクリプトです。タイムアウトしないんですね(汗)(汗)かなりこの部分が怪しいですね。タイトル、言われてみればその通り、後ほど修正します(なる早で…(_ _;)スミマセン)

    キャンセル

  • popobot

    2017/01/03 19:38 編集

    タイムアウトはしませんね。ただ、どうして上記のエラーがでているのかはよくわかりません。db_exp.shの実行方法がわかればわかるかもしれません。まぁ特別な理由がないなら、readで標準入力するのはやめて、引数で渡せばいいだけかもしれませんね。

    キャンセル

  • ssmxgo

    2017/01/04 01:38

    icchiiさん、ありがとうございます。実行方法は純粋に sh db_exp.sh です。確かに引数で渡されない場合、対話形式に勧めていくという親切設計で作ったシェルが結果的に悪さをしていたかもしれません。ただ問題はエックスサーバー社に対し対策案を提示するにも【ここがこのような理由で問題を起こしていた】が提示できないと説得するのに弱いなと心配です。これから再現テストをローカルで行って見る予定です

    キャンセル

回答 2

checkベストアンサー

0

zico_teratail さんの回答のコメントにしようかとも思いましたが、意見として責任も持ちたいので、回答として立てました。

ローカルに検証環境もなく、WordPress でサイト構築しているなんて、害悪以外何者でも無いと思いますよ。ボットネットのカモです。
ローカルに検証環境がないということは、当然セキュリティ情報も追いかけてないでしょうし、アクセスログの検証もされてないのではないでしょうか?

WordPress のボットネット化は、インターネット環境で非常に迷惑となっている現象の一つです。

自身の作ったシステムに責任を持てるようになるまで、システムの公開はやめていただけないでしょうか。少なくとも切り貼りでシステムを作って公開なんてことはやめて下さい。理解しないで作ったシステムは他者に迷惑をかける可能性が高いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/07 00:11 編集

    『でしょ?』『量産=ゴミスパムだろうから』という推測でしょ?
    推測をもとに炎上煽るの辞めなって。100%スパムだとなぜ断定できるんですか? 推測と事実に相違がある可能性を想定できないんですかね?

    人に『理解できるか?』と人に許容する前に、理解する努力をしたら如何ですか?
    しかも、コメント辞めてくださいと何度も書いてます。


    ワードプレスの利用云々とか話をすりかえるな。
    あなたの書き込みに対しては個別返信してます。
    そこまで考察して発言してるなんて毛頭思ってませんよ。あなたの発言によりこちらがその様な考え方もあると捉えただけ。

    で、技術の微塵にも参考にもならないTeratailを荒らすコメント書くなと言ってるんです。わざわざ自己弁護不要です。

    キャンセル

  • 2017/01/07 00:41

    めっちゃ早口で自己弁護乙詐欺師

    キャンセル

  • 2017/01/08 16:22 編集

    皆からマイナス評価受けて、事務局からコメント消されて乙。
    (^_^)/~バイバーイ
    (もう、引くに引けないんだね?書くほど暇ならマトモなキャッチボールし…イラね)

    キャンセル

0

bash の8-9行目のwhile文あたりに不可解な文字コードが入っていたもよう。
デバッグ作業で改行部分をいじっていたら正確な挙動になりました。

無事サーバー復旧出来そうです

ありがとうございました
また、ご迷惑おかけした皆様申し訳ありませんてした

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る