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

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

新規登録して質問してみよう
ただいま回答率
87.20%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

解決済

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

ssmxgo
ssmxgo

総合スコア178

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

2回答

0評価

0クリップ

2889閲覧

投稿2017/01/02 17:39

編集2017/01/03 07:57

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

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

lang

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

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

lang

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 を手動でインポートする際に特に中身を編集せずに違うデーターベース名、違うホスト名にそのまま取り込めたことに起因します。

追記です

lang

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

lang

#!/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までエラーを吐き出してしまう問題があればご指摘をお願いします

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

lang

#雛形ワードプレス用データベースのエクスポート 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';"

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

lang

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

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

lang

#設置用量産ワードプレスのデータベースへのインポート(これが怪しい) 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とは関係ないところです

lang

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ページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

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

popobot

2017/01/02 23:28

ログによればdb_exp.shのwhile文で無限ループしており、ループ内のreadで失敗して、エラーを出力し続けているのではないかと... db_exp.shがどのように実行されているのか書かれていないのでよくわかりません。
ssmxgo

2017/01/03 01:21

ありがとうございます。長文拵えて最後の最後でその可能性を考えました(^_^;) 後でアップしようと思いますが、このようなループがあった場合、ウェブの場合タイムアウトすると思いますがシェルも当然タイムアウトすると考えてぃしたがそうではないのでしょうか?
matobaa

2017/01/03 01:43

db_exp.shをどのように起動していますか? CGIのようにWebからの指示でしょうか。その場合でも、シェルスクリプトは通常はタイムアウトしません。ウェブでタイムアウトするのはブラウザ側の機能であって、起動したサーバ側プロセスは接続が切れても走り続けます。whlieは危険です。
matobaa

2017/01/03 01:44

タイトルが質問の内容を端的に示していないので修正してください。
ssmxgo

2017/01/03 01:48

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

2017/01/03 10:39 編集

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

2017/01/03 16:38

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

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

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。