掲題の通り、素人がシェルで動く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文が使われてますねぇ(汗)
まだ回答がついていません
会員登録して回答してみよう