SSブログ

PHP mysqliで新規DB作成(PHP+MySQL) [MySQL]



 PHP7でmysql_xx関数が廃止になりPHP7対応で、現在のDB名xxを新規にDB名OLD_xxにしてコピーを作成するPHPスクリプトをmysqliに変更する必要が生じた。しかしmysqliで新規DBを作成をネットで検索したが検索に引っかからない。色々試して、
$link = new mysqli(host,username,passwd)でdb名を指定しないでMySQLに接続後、
$link->query("CREATE DATABASE".dbname);
で作成することができたので、この時のスクリプト。
   略
  $link = new mysqli($SV_MySQL, $USER_MySQL, $PASS_MYSQL);
  $sql = "CREATE DATABASE ".$OLD_DBName;
  if($link->query($sql)) {
    //コマンド生成
    $cmd = 'mysql' . ' -u' . $USER_MySQL;
    $cmd .= ' -p' . $PASS_MYSQL;
    $cmd .= ' ' . $OLD_DBName;
    $cmd .=  ' < ' . $filename;
    //実行
    system($cmd, $ret);
    echo $ret;
  } else {
    echo $link->error;
  }
 略


Table有無確認(MySQL + PHP) [MySQL]


 PHPでMySQL上に指定したTableが存在するか否かを調べる必要があり、コードを書いたときの備忘録。
$sql=”SHOW TABLES  FROM ”.$db_name." LIKE '".$table_name."'";
if (!$result = $link->query()) {
  die("ShowTableに失敗しました(".$link->error.")");
}
if ($num_tables->num_rows == 0) {
  echo "Table ".$table_name."は存在しません。";
} else {
  echo "Table ".$table_name."は存在します。";
}

MySQL定時バックアップで大失敗 [MySQL]


 MySQLのデータをWindowsのタスクスケジューラを使用して毎日AM1:00に下記のようなバッチを起動してバックアップするように設定。作業が午後であったため、15:00にタスクスケジューラ起動するように設定して確認を実施。
バックアップが"DB名_backup_yyyymmdd_ttmmss.sql"のファイル名で作成されていることを確認できこれでOK。
 ところが後日、バックアップファイル名が"DB名_yyyymmdd_"となり、バックアップデータが無いファイルが作成されていることが判明。
 原因は、午前1時にtimeコマンドを発行すると01:mm:ssとなると思っていたが、実際は 1:xx:zzで先頭が0では無く空白となるのが原因でバッチが異常終了していた。この間バックアップデータが必要となる事態が無くて不幸中の幸い。
 下記のバッチの変更後にして、10時前でも10時後でも問題なくバックアップできるようになった。

変更内容
 time=%time: = 0%で10時以前は0t:mm:ssのように先頭に0を追加

@echo off

REM #===========================================#
REM # MYSQL バックアップ(日時ファイル名)
REM #===========================================#
REM 実行コマンドのPATH定義(MySQL mysqldumpの場所)
set dump_command="C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqldump" 

REM DB名定義
set db_name=DB名

REM バックアップ先定義
set backup_dir=バックアップ先

REM バックアップディレクトリへ移動
pushd %backup_dir%

REM タイムスタンプ(書式:YYYYMMDD_HHMISS)
変更前 set timestamp=%date:~,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%
      ↓
変更後 set time2=%time: =0%
変更後 set timestamp=%date:~,4%%date:~5,2%%date:~8,2%_%time2:~0,2%%time2:~3,2%%time2:~6,2%


REM バックアップファイル名
set backup_db_file=%backup_dir%%db_name%_backup_%timestamp%.sql

REM MYSQL ユーザー/パスワード定義
set user_mysql=xxxx
set password_mysql=yyyy

REM バックアップ開始
REM %dump_command% -u%user_mysql% -p%password_mysql% %db_name% > %backup_db_file%
 %dump_command% -u%user_mysql% -p%password_mysql% %db_name% > %backup_db_file%

REM # 6.7世代分より古いダンプファイル及びログを削除
for /f "skip=7 delims=" %%F in ('dir /b /o-d *.sql') do del "%%F"

REM 元のディレクトリへ移動
popd


DB登録データのダブリ抽出 [MySQL]

 DBシステムの移行時、古いDBデータにダブリが登録が無いか確認する必要がでることがある。副問い合わせを用いると簡単に実現できるが、還暦を過ぎて忘れっぽくなっているので備忘録として記載。

SELECT * FROM table名 WHERE 項目名 IN (SELECT 項目名 FROM table名 GROUP BY 項目名 HAVING COUNT(項目名) >1 )ORDER BY 項目名


既存テーブルにPrimary Key追加 [MySQL]


MySQLの既存テーブルにPrimary Keyが無く不都合があったのでPrimary Keyを追加する必要が生じた。既存テーブルに
ALTER TABLE table元 ADD data_ID int FIRST;
ALTER TABLE  table元  ADD PRIMARY KEY (data_ID);
ALTER TABLE  table元  CHANGE data_ID data_ID INT(11) NOT NULL AUTO_INCREMENT;
としたら
Data truncated for column 'data_ID' at row 1 
でエラー。 結局一旦"table元"の構造(スキマー)を"table写"にコピーしてこのテーブルにPrimary keyを追加、"table元"からデータのみをコピーすることでPrimary keyを追加することができた。解決までに時間が掛かったので忘れないように、詳細手順を記載。 -- Primary Keyの追加
CREATE TABLE table写 LIKE table元;
ALTER TABLE table写 ADD data_ID int FIRST;
ALTER TABLE table写 ADD PRIMARY KEY (data_ID);
ALTER TABLE table写 CHANGE data_ID data_ID INT(11) NOT NULL AUTO_INCREMENT;

ALTER TABLE table元 ADD data_ID int FIRST;
INSERT INTO  table写 SELECT * FROM table元;

DROP TABLE  table元;
ALTER TABLE table写 RENAME TO table元;



この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。