#contents

* リンク [#Link]
-~[[MySQL AB:http://www-jp.mysql.com/]]
-- [[MySQL 5.7 Reference Manual:http://dev.mysql.com/doc/refman/5.7/en/]]
--- [[7.3.6 Password Expiration Policy:http://dev.mysql.com/doc/refman/5.7/en/password-expiration-policy.html]]&br;
MySQL 5.7.4 ~ 5.7.10 は既定で360日後にパスワードが失効する。
--- [[11.1.9.3 The utf8mb4 Character Set (4-Byte UTF-8 Unicode Encoding):http://dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8mb4.html]]&br;
character-set = utf8 だと BMP 内の文字(最大3バイト)しか格納できない。&br;
BMP 外の文字(絵文字等)を格納するには character-set = utf8mb4 を使う必要がある。
-- [[MySQL 5.6 リファレンスマニュアル:http://dev.mysql.com/doc/refman/5.6/ja/]]
--- [[Unicode 文字セット:http://dev.mysql.com/doc/refman/5.6/ja/charset-unicode-sets.html]]
--- [[文字列関数:http://dev.mysql.com/doc/refman/5.6/ja/string-functions.html]] ## Split delimited strings
-- [[MySQL 5.1 リファレンスマニュアル:http://dev.mysql.com/doc/refman/5.1/ja/]]
--- [[INSERT ... ON DUPLICATE KEY UPDATE 構文:http://dev.mysql.com/doc/refman/5.1/ja/insert-on-duplicate.html]]
-- [[Connector/ODBC:http://dev.mysql.com/downloads/connector/odbc/]]
-~[[日本MySQLユーザ会:http://www.mysql.gr.jp/]]

- [[MySQLステップアップ講座:EnterpriseZine:http://enterprisezine.jp/article/corner/302]]

- [[How to split the name string in mysql? - Stack Overflow>Stackoverflow:14950466]]

- [[Perl/DBIx-NamedParams]]
- [[Perl/DBIx-Custom]]

* インストール [#Install]
 # yum -y install mysql-server

* 初期設定 [#Initialize]
/etc/my.cnf に追加
 [mysqld]
 default-character-set = utf8
 skip-character-set-client-handshake
 
 [mysqldump]
 default-character-set = utf8
 
 [mysql]
 default-character-set = utf8
 
 [client]
 default-character-set = utf8
 
 [odbc]
 default-character-set = utf8

MySQL起動
 # service mysqld start

mysqld自動起動設定
 # chkconfig mysqld on
 # chkconfig --list mysqld

セキュリティ初期設定
 # mysql_secure_installation

rootとしてログイン
 # mysql -u root -p

現在登録されているユーザ、ホスト、パスワード確認
// select user,host,password from mysql.user;
#code(sql){{{{
SELECT 
	CONVERT(user USING utf8) AS user, 
	CONVERT(host USING utf8) AS host, 
	password 
FROM 
	mysql.user;
}}}}

rootパスワード登録
#code(sql){{{{
set password for root@localhost=password('rootパスワード');
set password for root@'自分のホスト名'=password('rootパスワード');
}}}}

一旦ログアウトし、ログインし直してみてパスワードを確認
 mysql> exit
 # mysql -u root -p

匿名ユーザ削除
#code(sql){{{{
delete from mysql.user where user='';
}}}}

既存データベース一覧表示
#code(sql){{{{
show databases;
}}}}

testデータベース削除
#code(sql){{{{
drop database test;
}}}}

** 文字コード設定確認 [#showCharset]
 mysql> status
または
 mysql> show variables like 'char%';

** 新規データベースおよびユーザの追加 [#AddNewDB]
データベース仕様
:データベース|testdb
:ユーザ|testuser
:パスワード|testpass

rootとしてログイン
 # mysql -u root -p

TakeAsh.netドメイン内全体からのアクセスを許可する場合
#code(sql){{{{
grant all privileges on testdb.* to testuser@'%.TakeAsh.net' identified by 'testpass';
}}}}

192.168.0.xからのアクセスを許可する場合
#code(sql){{{{
grant all privileges on testdb.* to testuser@'192.168.0.%' identified by 'testpass';
}}}}

一旦ログアウトし、testuserでログインしてテスト
 mysql> exit
 # mysql -u testuser -p

既存データベース一覧表示
#code(sql){{{{
show databases;
}}}}

新規データベース作成
#code(sql){{{{
create database testdb;
}}}}

testdbに接続
#code(sql){{{{
use testdb
}}}}

既存テーブル表示
#code(sql){{{{
show tables;
}}}}

testtbl作成
#code(sql){{{{
create table testtbl(num int, name varchar(50));
}}}}

レコード登録
#code(sql){{{{
insert into testtbl values(1,'山田太郎');
insert into testtbl values(2,'岳');
}}}}

レコード表示
#code(sql){{{{
select * from testtbl;
}}}}

レコード更新
#code(sql){{{{
update testtbl set name='山田次郎' where num=1;
}}}}

レコード削除
#code(sql){{{{
delete from testtbl where num=1;
}}}}

テーブル削除
#code(sql){{{{
drop table testtbl;
}}}}

* root パスワードのリセット [#PasswordReset]
- 空のパスワードを設定することで、パスワード無しでログインできるようになる。&br;
作業終了後はパスワードを再設定すること。
 > SET PASSWORD FOR 'root'@'localhost' = PASSWORD('');

- [[MySQL 5.1 リファレンスマニュアル :: B.1.4.1 How to Reset the Root Password:http://dev.mysql.com/doc/refman/5.1/ja/resetting-permissions.html]]
- [[MySQL 4.1 リファレンスマニュアル :: A.4.2 忘れたルートパスワードをリセットする方法:http://dev.mysql.com/doc/refman/4.1/ja/resetting-permissions.html]]

* タイムゾーン確認/設定 [#TimeZone]
- /etc/my.cnf で設定する場合
 default-time-zone='+09:00'
- 対話的に設定
#code(sql){{{{
SET time_zone = '+09:00';
SET time_zone = 'SYSTEM';
}}}}
- 確認
#code(sql){{{{
SELECT @@global.time_zone, @@session.time_zone;
}}}}
- 現在時刻の表示
#code(sql){{{{
SELECT CURDATE(), CURTIME(), NOW();
}}}}

- [[MySQL サーバのタイム ゾーン サポート:http://dev.mysql.com/doc/refman/5.1/ja/time-zone-support.html]]

* ファイヤウォール設定 [#FireWall]
外部からmysqlへのアクセスを許可する
 3306:tcp

* バックアップ [#Backup]

** mysqldump コマンド [#Backup_mysqldump]
- [[mysqldump コマンド:http://dev.mysql.com/doc/refman/5.1/ja/mysqldump.html]] &br;
データベース/テーブルの内容を SQL スクリプトとして書き出す。
 $ mysqldump -u ユーザ名 -p データベース名 [テーブル名] -r バックアップファイル名.sql
- 主なオプション
-- --all-databases, -A&br;
すべてのデータベース内のすべてのテーブルをダンプする。
-- --force, -f&br;
テーブルダンプの最中にSQLエラーが発生しても続行する。

** リストア [#Backup_Restore]
- 文字コードを指定してリストア
 $ mysql -u ユーザ名 -p --default-character-set=utf8 データベース名
 mysql> SET names 'utf8';
 mysql> SOURCE バックアップファイル名.sql;

- [[Dumping and importing from/to MySQL in an UTF-8 safe way - makandropedia:https://makandracards.com/makandra/595-dumping-and-importing-from-to-mysql-in-an-utf-8-safe-way]]

** テーブルを個別にバックアップ [#Backup_makeBatch]
- 特定のデータベースについて、テーブル毎に個別にバックアップを行うスクリプト&br;
&ref(dump.zip);
#code(bash){{{{
#!/bin/bash
UserName=testuser
DataBase=testdb
WorkFile=tables.txt

echo enter database password:
read PASSWORD

mysql -u $UserName --password=$PASSWORD --database $DataBase -e "show tables;" > $WorkFile

exec 3< $WorkFile

# drop header line
read LINE 0<&3

while read LINE 0<&3
do
echo ${LINE}
mysqldump -u $UserName --password=$PASSWORD --force $DataBase ${LINE} > Tables/${LINE}.sql
done

exec 3<&-
}}}}

- [[シェル・スクリプト・リファレンス - 【 ファイルからの読み込み 】:ITpro:http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231099/]]

** ダンプをテーブル毎に分割 [#Backup_splitSqlDump]
- [[GitHub:TakeAsh/p-mysqlUtil]]
- &ref(splitSqlDump.zip);
#code(perl){{{{
#!/usr/bin/perl
# split MySQL dump into each tables.

use strict;
use warnings;
use utf8;
use Encode;

my $charsetConsole = 'CP932';
my $charsetFile    = 'UTF-8';

binmode( STDIN,  ":encoding($charsetConsole)" );
binmode( STDOUT, ":encoding($charsetConsole)" );
binmode( STDERR, ":encoding($charsetConsole)" );

@ARGV = map { decode( $charsetConsole, $_ ); } @ARGV;

my $infile         = $ARGV[0] or die("usage: splitSqlDump.pl <dump.sql>\n");
my $dirSqls        = './sqls/';
my $structuresfile = $dirSqls . '_structures.sql';

mkdir($dirSqls);
unlink <"${dirSqls}*">;

my $regSkip = qr{^\s*(
    LOCK\sTABLES\s`[^`]+`\sWRITE|
    /\*!40000\sALTER\sTABLE\s`[^`]+`\sDISABLE\sKEYS\s\*/|
    /\*!40000\sALTER\sTABLE\s`[^`]+`\sENABLE\sKEYS\s\*/|
    UNLOCK\sTABLES
);}x;
my $regInsert = qr{^\s*INSERT\sINTO\s`(?<table>[^`]+)`\sVALUES\s\([\s\S]+\);};
my $regBreak  = qr{(VALUES\s|\),)(\()};

open( my $fhIn, "<:raw", encode( $charsetConsole, $infile ) )
    or die("$infile: $!");
open( my $fhStructures, ">:raw", encode( $charsetConsole, $structuresfile ) )
    or die("$structuresfile: $!");
my $prevTable = '';
my $fhTable   = undef;
while ( defined( my $line = <$fhIn> ) ) {
    if ( $line =~ $regSkip ) {
        next;
    } elsif ( $line !~ $regInsert ) {
        print $fhStructures $line;
    } else {
        renewTable($1);
        $line =~ s/$regBreak/$1\n\t$2/g;
        print $fhTable $line;
    }
}
close($fhIn);
close($fhStructures);
renewTable('');

sub renewTable {
    my $newTable = shift;
    if ( $prevTable eq $newTable ) {
        return;
    }
    if ($fhTable) {
        print $fhTable "/*!40000 ALTER TABLE `${prevTable}` ENABLE KEYS */;\n";
        print $fhTable "UNLOCK TABLES;\n";
        close($fhTable);
    }
    if ( !$newTable ) {
        return;
    }
    my $tableFile = $dirSqls . $newTable . '.sql';
    open( $fhTable, ">:raw", encode( $charsetConsole, $tableFile ) )
        or die("$tableFile: $!");
    print $fhTable "LOCK TABLES `${newTable}` WRITE;\n";
    print $fhTable "/*!40000 ALTER TABLE `${newTable}` DISABLE KEYS */;\n";
    $prevTable = $newTable;
}

# EOF
}}}}

* テーブルの修復 [#Repair]
- [[CHECK TABLE:http://dev.mysql.com/doc/refman/5.1/ja/check-table.html]]
- [[REPAIR TABLE:http://dev.mysql.com/doc/refman/5.1/ja/repair-table.html]]

* テーブルの最適化 [#Optimize]
- [[OPTIMIZE TABLE:https://dev.mysql.com/doc/refman/5.6/ja/optimize-table.html]]

* データベースのリネーム [#RenameDatabase]
- [[How do I quickly rename a MySQL database (change schema name)? - Stack Overflow>Stackoverflow:67093]]
-- [[MySQL :: WL#4030: Deprecate RENAME DATABASE: replace with ALTER DATABASE &lt;name> UPGRADE:https://dev.mysql.com/worklog/task/?id=4030]]

* Windowsからのアクセス [#SettingForWindows]
''注意) MySQL 5.0.37 / ODBC Driver 3.51.12 / Windows の構成では文字化けする。''

** ODBCドライバの登録 [#ODBCDriver]
+ [[Connector/ODBC:http://dev.mysql.com/downloads/connector/odbc/]] のWindows MSI版をダウンロード
+ インストール (構成は「Typical」でOK)
+ 「設定 - コントロールパネル - 管理ツール - データソース(ODBC)」を起動
+ 「ユーザーDSN」または「システムDSN」を選択
-- 特定のユーザーのみが使用する場合は、「ユーザーDSN」を選択
-- 全ユーザーが使用する場合は、「システムDSN」を選択
+ 「追加」をクリック
+ 「MySQL ODBC x.xx Driver」を選択(x.xxはバージョンナンバー)
+ 「完了」をクリック
+ 「Login」タブを記入
++ 「Data Source Name」は任意の名前でOK&br;
例) MySQL ODBC Connector
++ 「Description」は任意。空白も可
++ 「Server」にサーバ名またはIPアドレスを記入。&br;
例) mysql1.TakeAsh.net
++ 「User」にユーザ名を記入&br;
例) testuser
++ 「Password」にパスワードを記入&br;
例) testpass
++ 「Test」をクリック&br;
サーバ側の設定が正常にできていれば「Success; connection was made!」と表示される。&br;
エラーダイアログが出た場合は「Diagnostics」をクリックするとエラーメッセージの詳細が出る。
++ 「Database」を選択&br;
+ 「Advanced」タブを選択しoptionを設定する&br;
[[Connector/ODBC Connection Parameters:http://dev.mysql.com/doc/refman/5.1/ja/myodbc-configuration-connection-parameters.html]]
-- Microsoft Access、Visual Basic 用推奨設定
--- Don't Optimized Column Width にチェックを入れる
--- Return Matching Rows にチェックを入れる
-- Read Options From my.cnf にチェックを入れる
+ 「OK」をクリック

** Common SQL Environment (CSE) [#CSE]
-~インストール
++~CSE のダウンロード&br;
[[つみきウェブ:http://www.hi-ho.ne.jp/tsumiki/]]
++~圧縮ファイルを展開し、適当なフォルダに配置する&br;
例) C:\Program Files\CSE
++ CSEを実行する
++ メニューの「ツール - 設定」を選択
++ 「機能」タブで「SQLエクスプローラ」の「ルートフォルダ」を指定する&br;
例) C:\Program Files\CSE\SQL

-~データベースへの接続
++ メニューの「データベース - 接続」を選択
++ 「DBMS」は「ODBC汎用」を選択
++ 「データソース」はODBCドライバとして登録したものを選択&br;
例) MySQL ODBC Connector
++ 「ユーザ名」にユーザ名を記入&br;
例) testuser
++ 「パスワード」にパスワードを記入&br;
例) testpass
++ 「OK」をクリック

-~テーブルの全内容を表示&br;
++ 「DBエクスプローラ」で、「テーブル」を展開
++ 内容を表示したいテーブルの上で右クリックし「全データを開く」を選択
++ 「コンソール」に該当テーブルの内容が表示される

-~テーブルの更新
++ 「コンソール」に表示されたテーブルの該当箇所を更新する
++ メニューの「データベース - 編集の反映」を選択
++ 確認ダイアログの「OK」をクリック

-~テーブルのエクスポート
++ 該当テーブルの上で右クリックし「全データをエクスポート」を選択
++ フォルダとファイル名を指定し「保存」をクリック
++ CSVファイルが書き出される (Shift_JIS)

-~データのインポート
++ インポートしたいテーブルの上で右クリックし「データをインポート」を選択
++ CSVファイルを指定し「開く」をクリック

-~SQLの実行
++ 「新規作成」でスクリプトウィンドウを開く
++ SQLを記述する
++ メニューの「データベース - 実行」を選択

** ODBC/ConnectionString による接続 [#ConnectionString]
 DRIVER={MySQL ODBC x.xx Driver}; SERVER=サーバ名; DATABASE=データベース名; UID=ユーザ名; PASSWORD=パスワード; OPTION=オプション
例) DRIVER={MySQL ODBC x.xx Driver}; SERVER=mysql1.TakeAsh.net; DATABASE=testdb; UID=testuser; PASSWORD=testpass; OPTION=65539

** A5:SQL Mk-2 [#A5m2]
- [[松のページ:http://www.mmatsubara.com/]]
-- [[A5:SQL Mk-2:http://a5m2.mmatsubara.com/]] フリーの汎用SQL開発ツール/ER図ツール

- 後で試す。

リロード   新規 下位ページ作成 編集 凍結 差分 添付 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS