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元;