Illegal mix of collationsのエラーが出た場合
異なる属性のデータをlikeに指定している可能性があります。
intSize lile ‘あああ’
属性を合わせた値をセットしましょう。
メルマガ登録をお願いします。
素敵な?情報がいつもあなたに届くようになります。(itmnewsの記事が届きます。)お役に立つかどうかわかりませんが頑張りますっ。登録してみてください。
ITツールの活用方法やプログラム覚えて思い描いているものを実現したい方向け
Illegal mix of collationsのエラーが出た場合
異なる属性のデータをlikeに指定している可能性があります。
intSize lile ‘あああ’
属性を合わせた値をセットしましょう。
素敵な?情報がいつもあなたに届くようになります。(itmnewsの記事が届きます。)お役に立つかどうかわかりませんが頑張りますっ。登録してみてください。
TIMESTAMP型で属性が「on update CURRENT_TIMESTAMP」となっているフィールドは更新時に自動で最新の日付がセットされるので便利な時もありますが、処理の都合上、更新したくないときは、明示的に更新を避けるような
SQL文を組み込むことができます。
日付フィールド名 = 日付フィールド名 のように、現在のフィールド値にフィールド名を入れるようなupdate文を作り実行すればOKです。
例
update table_name set value = ‘12345’, startYmd = startYmd where id = ‘1234’;
素敵な?情報がいつもあなたに届くようになります。(itmnewsの記事が届きます。)お役に立つかどうかわかりませんが頑張りますっ。登録してみてください。
2015-07-12前回、前々回とRDS内でのレプリケーションの仕組み、MySQLでのレプリケーションの仕組みををまとめましたが
それを踏まえて
リージョン間でレプリケーションしたらどうなるかをまとめてみました。
つまり更新系はマスターでないと他のスレーブに配ってくれないので、データは
マスターに行く。参照系は、各リージョンにあるRDSに繋げば、データ量が多いクエリも
マスターを見に行くより早いのは間違いない。
この方法による構築での課題点は
・参照系と更新系でデータベースの接続先が違う。
・MySQLのレプリケーションは非同期レプリケーションなので、タイミングによっては、
整合性がとれていないクエリー結果になってしまう。
上記の図の例で言いますと、海外1と海外2はタイミングによっては、結果がずれる。
東京は、マスターを参照するので、ずれはない。
因みに、リージョン内での参照系レプリケーションであればRDS側のReadReprication機能で対応できます。
具体的な手順を以下に記載します。
•MySQL5.6.13のRDS
•Publicly AccessibleをON
•Mullti-AZオプションはOFF
•セキュリティグループではお互いの通信を許可
ポートの開放
インバウンド、アウトバウンド両方
1 |
mysql -h m1.cyxgcupsoi5z.ap-southeast-1.rds.amazonaws.com -P 3306 -u root -p test_db |
5.ここでレプリケーション用のユーザーを作成しておく
1 |
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'password'; |
6.テスト用のテーブルを作成する。
1 2 3 |
create table test_table (id int, name varchar(128), tel char(10), mail char(100)) character set utf8; insert into test_table values (1, 'tanaka', '090-111-5555','tanama@exsample.com'); insert into test_table values (2, 'sato', '090-222-6666','sato@exsample.com'); |
7.バイナリ―のログにアクセスできるようにストアドプロシージャーを実行する。
1 |
call mysql.rds_set_configuration('binlog retention hours', 72); |
8.内容を控えておく
1 2 3 4 |
show master status; +----------------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +----------------------------+----------+--------------+------------------+-------------------+ | mysql-bin-changelog.000333 | 954| | | | +----------------------------+----------+--------------+------------------+-------------------+ |
8.次に、スレーブ用のリージョンのRDSのインスタンスを起動します。
同じようにポートを解放してください。
9.スレーブのデータベースに接続します。
1 |
mysql -h m1.cyxgcupsoi5z.ap-southeast-1.rds.amazonaws.com -P 3306 -u root -p test_db |
10.レプリケーション用のユーザーを作成します。
1 |
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'passward'; |
11.マスターのデータベースをそのままスレーブにコピーします。
最初にマスターをダンプします。
1 |
$ mysqldump -h m1.cyxgcupsoi5z.ap-southeast-1.rds.amazonaws.com -u root -p --databases test_db > dumpfile |
次にスレーブ側でダンプファイルをインポートします。
1 |
mysql -h m1.cyxgcupsoi5z.ap-southeast-1.rds.amazonaws.com -u root -p test_db < dumpfile |
12.スレーブ側 mySQLにて以下ストアドプロシージャ―を実行します。
先程の内容をセットします。
1 |
call mysql.rds_set_external_master('master.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com',3306,'repl','password','mysql-bin-changelog.000333',954,0); |
13.スレーブ側でレプリケーションを開始します。
1 |
CALL mysql.rds_start_replication; |
14.状況確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: m1.cyxgcupsoi5z.ap-southeast-1.rds.amazonaws.com Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin-changelog.000408 Read_Master_Log_Pos: 422 Relay_Log_File: relaylog.000203 Relay_Log_Pos: 595 Relay_Master_Log_File: mysql-bin-changelog.000408 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: mysql.plugin,innodb_memcache.cache_policies,mysql .rds_sysinfo,mysql.rds_replication_status,mysql.rds_history,innodb_memcache.conf ig_options Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 422 Relay_Log_Space: 818 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 17714962 Master_UUID: 030d3d6b-26c6-11e5-8a5c-064062dd903b Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for the sla ve I/O thread to update it Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 1 row in set (0.22 sec) |
13.マスター側で
データを登録
1 |
insert into test_table values (3, ’takahashi’, '999-999-999', 'takahashi@example.com'); |
14.スレーブ側でレコードが増えているか確認 レコードが1件増えていれば
同期確認完了。
1 2 3 4 5 6 |
select * from test_table ; +------+------+-------+--------------+ | id | name| tel | mail| +------+------+-------+--------------+ | 1 | tanaka| 090-111-5555| tanama@exsample.com| | 2 | sato | 090-222-6666| sato@exsample.com| | 3 | takahashi | 999-999-999| takahashi@example.com| +------+------+-------+--------------+ |
素敵な?情報がいつもあなたに届くようになります。(itmnewsの記事が届きます。)お役に立つかどうかわかりませんが頑張りますっ。登録してみてください。
前回のアマゾンクラウドでのお話でもお伝えしましたが、レプリケーションとは、
データベースを複製することで、以下の役割を満たします。
・データベースがぶっ壊れたときのための予備
・もうひとつ同じデータベースを作っておくことで負荷分散スピードアップ
mysqlは
非同期レプリケーションによるマスタースレーブ型です。
非同期レプリケーションとはマスターの更新状況の保全を待たず同時に書き込むこと。
マスタースレーブ型はマスター1つに複数のスレーブを持つ。更新はマスターに全てやらせる
その内容をスレーブが取りにいく仕組み。
高機能のデータベースソフトはマルチマスター型もできる。
常に自分もマスターになれるということ。みんなで更新する感じですね。
mySQLは、マスタースレーブの関係は出来上がっています。
素敵な?情報がいつもあなたに届くようになります。(itmnewsの記事が届きます。)お役に立つかどうかわかりませんが頑張りますっ。登録してみてください。
select count(*) from sys.columns
where object_id=object_id(‘テーブル名’)
sys.columsというシステムで用意されたテーブル(ディクショナリ)に
を参照して取得するというパターン
素敵な?情報がいつもあなたに届くようになります。(itmnewsの記事が届きます。)お役に立つかどうかわかりませんが頑張りますっ。登録してみてください。
■構想検討
構想としましては
OSが異なるので、お互いAPIを用意し、API経由でデータを連携させるように構想しました。
お互いのOSからクロスで放り込む方法も見つけましたが
LINUX→SQLServerの場合、ドライバーをLINUX上にインストールする必要が発生する可能性があり
難易度が少し上がります。
■仕様
クロス同期つまり、ひとつの会社テーブルの情報を常に同期させる。ASP側で更新されたらLAMPにも更新するし
逆も同様にする。
■環境準備
LAMPのシステムとASP.NETシステムの環境のデータ同期ということ。
データベースの方は一緒。SQLServerのデータをMySQLに移行。
workbenchを使います。
データ変換には癖がありますが、何回か行っていると規則性が見えてきます。
■具体的なコーディング
お互いPOSTで渡す仕組みを実現します。
phpからASPへは
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
file_gets_contents関数です。 $url = $strHost.'/api/CompanyUpdate.aspx'; $data = http_build_query($data, "", "&"); //header $header = array( "Content-Type: application/x-www-form-urlencoded", "Content-Length: ".strlen($data) ); $context = array( "http" => array( "method" => "POST", "header" => implode("\r\n", $header), "content" => $data ) ); $contents = file_get_contents($url, false, stream_context_create($context)); if(!$contents){ //エラー時制御 } |
curlのライブラリから行ったほうが実績があったのですが、
なるべく標準関数(curlもすでに共通ですが)で行った方が望ましいかと考えました。
ASPからphpへは
//バイト型配列に変換
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
string postData = "StrCompanyID=" + HttpUtility.UrlEncode(CommonUtil.Security.FromBase64(StrCompanyID.Value), enc) + "&StrPassword=" + HttpUtility.UrlEncode(StrPwd.Value, enc); byte[] postDataBytes = System.Text.Encoding.ASCII.GetBytes(postdata); System.Net.WebRequest req = // System.Net.WebRequest.Create(_url + "/api/set_entry.php"); System.Net.WebRequest.Create(_url + "/index.php?controller=ApiRev&action=set_update2"); /// //メソッドにPOSTを指定 req.Method = "POST"; //ContentTypeを"application/x-www-form-urlencoded"にする req.ContentType = "application/x-www-form-urlencoded"; //POST送信するデータの長さを指定 req.ContentLength = postDataBytes.Length; //データをPOST送信するためのStreamを取得 System.IO.Stream reqStream = req.GetRequestStream(); //送信するデータを書き込む reqStream.Write(postDataBytes, 0, postDataBytes.Length); reqStream.Close(); //サーバーからの応答を受信するためのWebResponseを取得 System.Net.WebResponse res = req.GetResponse(); //応答データを受信するためのStreamを取得 System.IO.Stream resStream = res.GetResponseStream(); //受信して表示 System.IO.StreamReader sr = new System.IO.StreamReader(resStream, enc); Console.WriteLine(sr.ReadToEnd()); |
POSTを&でつなげてPOST送信します。
メルマガ登録して、小技を身に着けてください。
素敵な?情報がいつもあなたに届くようになります。(itmnewsの記事が届きます。)お役に立つかどうかわかりませんが頑張りますっ。登録してみてください。
名称
SQLServer ストアドプロシージャー
MySQL ルーチン
まだまだMySQLは簡易的な印象を受ける。
SQLServerでバリバリ動いていたデータベースをMySQLに移植するのは
どこまで耐久力があるかどうかというのが心配なところ。
まずはDECLARE
デクレアで変数宣言これは共通かな。
上記でまとめて宣言が必要
テンポラリーテーブルの最初の文字は#をつけない。
ISNULLよりIFNULL
素敵な?情報がいつもあなたに届くようになります。(itmnewsの記事が届きます。)お役に立つかどうかわかりませんが頑張りますっ。登録してみてください。
http://www.sonorilo.net/2010/03/02/2718
検索条件の挙動が微妙。。
親切なのはありがたいですね。
でも親切すぎると。。
おせっかいとか言われてしまう。
素敵な?情報がいつもあなたに届くようになります。(itmnewsの記事が届きます。)お役に立つかどうかわかりませんが頑張りますっ。登録してみてください。
MySQLで?とか日本語が表示されてしまったときは
$db->query(“SET NAMES sjis”);
で直る場合がよくあります。
みなさんお試しください。
素敵な?情報がいつもあなたに届くようになります。(itmnewsの記事が届きます。)お役に立つかどうかわかりませんが頑張りますっ。登録してみてください。
valuedomainから上位coreserverへのデータベース移行メモ
1.valuedomainの管理画面にてデータベースの保存を
行います。
2.データベース間コピーを行い、mysql.dumpファイルを coreserverへコピーします。
3.コアサーバーへログインして、データベースを作成します。
4.sshでログインして
データベースを使用するようにします。
$ mysql -u newdatabase -p
password:
mysql >use newdatabase
mysql >source mysql.dump
でインポート完了
素敵な?情報がいつもあなたに届くようになります。(itmnewsの記事が届きます。)お役に立つかどうかわかりませんが頑張りますっ。登録してみてください。