掲題の通り、素人がシェルで動くMySQLをアプリケーションに組み込んでしまったため、共有サーバで多大な迷惑をかけてしまいました。色々お叱りがあると思いますが何卒お手柔らかにお願い致します。
まず、細かい経緯はさておき、シンプルにシェルからのMySQLコマンドに問題はあるでしょうか?これがわかれば以下の詳細は目を通す必要がないかもしれません
lang
1 mysql -h${DB_HOST} -u${DB_USER} -p${DB_PASS} ${IM_DB_NAME} < $(cd $(dirname $0) && pwd)/db.dump
db.dump は以下の出力結果です。データベースの中身はワードプレス本体です。
lang
1 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
1 7 if [ ! $1 ]; then 2 8 while [ ! $EX_DB_NAME ] 3 9 do 4 10 echo "元データベース名を入力してください" 5 11 read EX_DB_NAME 6 12 done 7 13 else 8 14 #引数1番めの指定を反映 9 15 EX_DB_NAME=$1 10 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
1#!/bin/sh 2#オリジナル=>テスト環境コピー 3DB_USER=xxxx 4DB_PASS=xxxx 5DB_HOST_DEF=mysqlxxxx.xsrv.jp 6DOMAIN=mydomain.com 7 8if [ ! $1 ]; then 9 echo "元データベース名を入力してください" 10 read EX_DB_NAE 11 TEMP=${EX_DB_NAME:=def_db_name} 12else 13 #引数1番めの指定を反映 14 EX_DB_NAME=$1; 15fi 16#echo $EX_DB_NAME 17 18if [ ! $2 ]; then 19 while [ ! $IM_DB_NAME ] 20 do 21 echo "送り先データベース名を入力してください" 22 read IM_DB_NAME 23 done 24else 25 #引数2番めの指定を反映 26 IM_DB_NAME=$2; 27fi 28#echo $IM_DB_NAME 29 30if [ ! $3 ]; then 31 while [ ! $SUBDOMAIN ] 32 do 33 echo "インストール先のサブドメイン(ディレクトリ名)を入力してください" 34 read SUBDOMAIN 35 done 36else 37 #引数3番めの指定を反映 38 SUBDOMAIN=$3; 39fi 40#echo $SUBDOMAIN 41 42if [ ! $4 ]; then 43 echo "データベースホストを入力してください(デフォルト: ${DB_HOST_DEF})" 44 read DB_HOST 45 TEMP=${DB_HOST:=$4} 46 TEMP=${DB_HOST:=${DB_HOST_DEF}} 47else 48 #引数4番めの指定を反映 49 DB_HOST=$4; 50fi 51#echo $DB_HOST 52 53if [ ! $5 ]; then 54 echo "カスタマIDをを入力してください(デフォルト: null)" 55 read HID 56 TEMP=${HID:=$5} 57 TEMP=${HID:=NULL} 58else 59 #引数4番めの指定を反映 60HID=$5; 61fi 62#echo $HID 63 64echo "●設定" 65 66#dev db->export 67echo "DB->export ${EX_DB_NAME}" 68mysqldump --single-transaction -h${DB_HOST} -u${DB_USER} -p${DB_PASS} ${EX_DB_NAME} > $(cd $(dirname $0) && pwd)/db.dump 69 70#new db<-import 71echo "DB<-import ${IM_DB_NAME}" 72mysql -h${DB_HOST} -u${DB_USER} -p${DB_PASS} ${IM_DB_NAME} < $(cd $(dirname $0) && pwd)/db.dump 73 74#set wp-options 75echo "Wordpress setting... ${IM_DB_NAME}" 76mysql -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';" 77mysql -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';" 78 79#wordpress config 80echo "Wordpress setting... " 81cat $(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} 82/public_html/${SUBDOMAIN}/wp/wp-config.php 83 84 85echo "スクリプト終了"
これらがとんでもない量のエラーログを吐き出す原因になるのでしょうか?今はエックスサーバーのアカウントログインを制限されログを確認することができません
以下、詳細です
経緯
当初は表面上は問題もなく動いていたのですが、エックスサーバーからエラーログが大量に作成されサーバー負荷が高いと指摘される。
『ページリダイレクト問題絡みでシェルが何度も走ってしまった』と思い、リダイレクトの懸念があった場所を回避させる形で、『直りました報告』し、制限解除されてからの再度の過負荷で当然のアカウント制限までかけられてしまいました。
##しがない考察
個人的に結論として、数百GB〜数TBのログ(にわかには信じられなかった)が一般公開していないページのリダイレクト不具合で貯まるとも考え難く、シェルの書き方、MySQLの理解に問題があったのではないかと思い問題解決の手がかりのご教授いただきたく書き込ませていただきました。
追記
シェルに while文が使われてますねぇ。こいつがタイムアウトせず延々と走り続けるということはあるのでしょうか。ここも改めて見直してみます
アプリケーションの仕様
エックスサーバーでの運用
(今になって失敗したなと思っていますが、未公開サイトでしたのでエックスサーバーで直接開発。ローカル環境ではテストしていません → この状況になり今環境を作っている最中)
構成
アプリケーションはワードプレスと、自作の管理ツールで形成されます。
①雛形ワードプレスサイトの複製し量産、量産した個々のサイトをワードプレス管理画面からカスタマイズした後、②ワードプレスのデータベースをダンプし、サイトの全ファイルと共に圧縮。
別途契約されたエックスサーバー内で解凍し③データベースをインポートしカスタマイズされた量産ワードプレスサイトの設置完了。
問題部分
①~③のタイミングでシェル側から発行したMySQL自体に問題がある?と考え、数GB~数TBまでエラーを吐き出してしまう問題があればご指摘をお願いします
①雛形ワードプレスサイトの量産(カスタマイズ用)
lang
1 #雛形ワードプレス用データベースのエクスポート 2 mysqldump --single-transaction -h${DB_HOST} -u${DB_USER} -p${DB_PASS} ${EX_DB_NAME} > $(cd $(dirname $0) && pwd)/db.dump 3 4 #カスタマイズ用量産ワードプレスのデータベースへのインポート(これが怪しい) 5 mysql -h${DB_HOST} -u${DB_USER} -p${DB_PASS} ${IM_DB_NAME} < $(cd $(dirname $0) && pwd)/db.dump 6 7 #カスタマイズ用量産ワードプレスのデータベースの設定値の変更 8 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';" 9 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
1 #カスタマイズ用量産ワードプレスのデータベースのエクスポート 2 mysqldump --single-transaction -h${DB_HOST} -u${DB_USER} -p${DB_PASS} ${EX_DB_NAME} > $(cd $(dirname $0) && pwd)/db.dump
③カスタマイズされた量産ワードプレスを別サーバーに設置
lang
1 #設置用量産ワードプレスのデータベースへのインポート(これが怪しい) 2 mysql -h${DB_HOST} -u${DB_USER} -p${DB_PASS} ${IM_DB_NAME} < $(cd $(dirname $0) && pwd)/db.dump 3 4 #量産ワードプレス用データベースの設定値の変更 5 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';" 6 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
1 7 if [ ! $1 ]; then 2 8 while [ ! $EX_DB_NAME ] 3 9 do 4 10 echo "元データベース名を入力してください" 5 11 read EX_DB_NAME 6 12 done 7 13 else 8 14 #引数1番めの指定を反映 9 15 EX_DB_NAME=$1 10 16 fi
なんか、ここでGBクラスのログが吐かれるとは思ってもいなかったのですが、よく見たらwhile文が使われてますねぇ(汗)

回答2件
あなたの回答
tips
プレビュー