MySQL 総合 Part4

このエントリーをはてなブックマークに追加
952NAME IS NULL:2005/07/13(水) 01:16:23 ID:aWcHVZvA
>>951
MasterでInnoDBなテーブルをSlaveではMyISAMで保持したりとか、
レプリケーションのバックアップとしての利用は奥が深い。

ストレージエンジン固有の -例えばInnoDBHotBackupとか- バックアップツールというのも
あるわけだが、MySQLは全ての更新情報をbinlogとしてログを残すことができるというのが
大きな特徴でもある。

いわゆる「フルバックアップ+差分バックアップ」の考え方でいくと、単にbinlogを保存するだけだと
フルバックアップに相当するものがないけど、レプリケーションを使えば補える。

レプリケーションも、常時レプリケーションをさせるだけでなく、定期的にレプリケーションを
稼動させることで、「binlogという差分をフルバックアップに当てる」というようなやり方もできる。

MasterでInnoDBだったテーブルをSlaveでMyISAMにすることで、さらにそこから
バックアップを取ったりするのも容易になる。

↑ちょっとあまりまとまってないけれども、米国Yahoo!comとかのMySQLユーザ大手企業では
レプリケーションを中心に据えたバックアップ運用をしてるとか聞いた。

953NAME IS NULL:2005/07/13(水) 08:05:30 ID:lDu7Hvfy
>>951
レプリケーションの最大の弱点は、Masterに対するDBAのオペレーティングミス。
間違えてTableをDropしちゃったりすると、もちろんそれがSlaveにも反映されてしまう。

そ、そ、そんなばかなー!!
954NAME IS NULL:2005/07/13(水) 15:33:11 ID:???
( ゚д゚)?
955NAME IS NULL:2005/07/13(水) 20:57:04 ID:???
>>952-953
俺も>>953のを想像したんだが、>>952の言う
間欠的にレプリケーションをさせるというのは、
俺的には新しい観点で、Masterの運用に影響もなく、
いいのかもしれないね。
956NAME IS NULL:2005/07/13(水) 23:58:26 ID:B1MsBXgZ
RedHatLinux 9.0 にMySql5.0.7 beta を入れたいのですが、どれをダウンロードすればよいのでしょうか。
957NAME IS NULL:2005/07/14(木) 02:44:15 ID:j1+loLdd
>>956
お前さんが使っているマシン(CPUアーキテクチャ)などによるのでそれだけじゃ何とも言えないね。

でもまあ、普通の32bit CPUにRedhat9.0入れているだけで、特に深い意味はない質問です、
というのなら、これなんてどうでしょう。

Linux (x86, glibc-2.2, static, gcc)

漏れ的にはRPM版よりもtar.gz版がお勧め。展開して/usr/loca/mysqlからシンボリックリンクを張れ。

958957:2005/07/14(木) 05:38:43 ID:j1+loLdd
>>957
× /usr/loca/mysql
○ /usr/local/mysql

orz...
959NAME IS NULL:2005/07/14(木) 06:12:13 ID:???
>>957
アップグレードはどうやるの?
960957:2005/07/14(木) 10:31:59 ID:j1+loLdd
>>959
/usr/local/mysql-x-xx-xxxx
/usr/local/mysql-y-yy-yyyy
/usr/local/mysql-z-zz-zzzz

という風にバージョンごとに実体は置いておく。

今現在使いたいMySQLに対して /usr/local/mysql -> /usr/local/mysql-x-xx-xxxx という風にシンボリックリンクを張り、
基本的にはこのシンボリックリンクの切り替えだけで、どんなバージョン、あるいはどんなMySQLのセットも1発で切り替え。

PATHは/usr/local/mysql/binに通しておく。

my.cnfは/usr/local/mysql-x-xx-xxxx/dataそれぞれに書いておく。

/usr/local/mysql/data/my.cnfを読んでくれるバイナリならそれだけでOK。

/etc/my.cnfじゃないと駄目なバイナリ対策として、さらに /etc/my.cnf -> /usr/local/mysql/data/my.cnf へシンボリックリンク。

このやり方にしてから、まあ検証環境がメインだけどしょっちゅう稼動バージョン変更だとかそういうのも一発でできてるお。

この手のノウハウについては英語圏ではいろいろ本とか記事?とかでてるみたいよ。
961NAME IS NULL:2005/07/14(木) 10:57:32 ID:???
>>960
で、データーベースの移行はどうやるの?
962956:2005/07/14(木) 12:34:34 ID:???
>>957
どうもでありがとうです。 
どこ見ても説明がみつからんもんで・・・。

CPUすんません。おっしゃるとおりで、Celeronです。
963NAME IS NULL:2005/07/14(木) 13:54:35 ID:???
SQLの書き方で困っています

TBL1
+----+----+----+
|FLD1|FLD2|FLD3|
+----+----+----+
|1001|1AAA|1BBB|
|1002|2AAA|2BBB|
|1003|3AAA|3BBB|

TBL2
+----+----+----+
|FLD4|FLD5|FLD1|
+----+----+----+
|2001|1CCC|1001|
|2002|2CCC|1002|
|2003|3CCC|1002|
|2004|2CCC|1003|
|2005|3CCC|1003|

TBL2.FLD5 の 2CCC で検索した時に

Result
+----+----+----+----+----+
|FLD4|FLD5|FLD1|FLD2|FLD3|
+----+----+----+----+----+
|2002|2CCC|1002|2AAA|2BBB|
|2003|3CCC|1002|2AAA|2BBB|
|2004|2CCC|1003|3AAA|3BBB|
|2005|3CCC|1003|3AAA|3BBB|

のような感じでレコードを抽出したいんです

SELECT * FROM TBL1,TBL2
WHERE (TBL1.FLD1 = TBL2.FLD1)
AND
(TBL1.FLD1 = (SELECT FLD1 FROM TBL2 WHERE FLD5 LIKE "2CCC"))

と書いてみたんですが駄目でした
SQLをどのように書けばいいのでしょうか?

さくらのレンタルサーバー使用でMySQLのバージョンは4.0.20です
964NAME IS NULL:2005/07/14(木) 14:30:31 ID:???
>>963
MySQL4.0.x系はサブクエリが使えないからツライね。
手元に4.0.x系がないので動くかどうか判らないけど、こんなもんでどうだろうか。

SELECT DISTINCT
tbl2.fld4, tbl2.fld5, tbl2.fld1, tbl1.fld2, tbl1.fld3
FROM tbl2
LEFT OUTER JOIN tbl1 ON tbl2.fld1 = tbl1.fld1
LEFT OUTER JOIN tbl2 AS t ON tbl2.fld1 = t.fld1
WHERE tbl2.fld5 = '2CCC' OR t.fld5 = '2CCC'
965802:2005/07/14(木) 16:08:19 ID:bLVhDXNB
初歩で申し訳ないですが...
not null を指定してても、insertなどでそのカラムを指定し忘れた場合でもエラーが出ません。

create table test(
 i int not null,
 c char(1) not null,
 v varchar(10)
);

insert into test(v) value("a"); # エラーは出ない。

こういった場合にはエラーが出るようにテーブルを作るにはどのようにしたら良いのでしょうか?
966NAME IS NULL:2005/07/14(木) 16:29:43 ID:???
>>965
え〜と思って調べてみたらその動作は正しいみたいだね。知らんかった。。。
MySQLのビルド時に指定しておかないとダメっぽいね。
この辺りを参照してみてくだされ。
http://dev.mysql.com/doc/mysql/ja/constraint-not-null.html

MySQL5.0.2以降はmysqldの起動パラメータで設定できるみたいだけど、
現状ではアプリケーション側で対処するしかないみたいだね。
967NAME IS NULL:2005/07/14(木) 19:40:08 ID:???
>>963
これってつまり何をやってるん?
968965:2005/07/14(木) 20:01:22 ID:bLVhDXNB
>>966
有難う御座います。そうなんですね...。
アプリ側で考えます。
969963:2005/07/14(木) 20:06:38 ID:???
>>964さん

ありがとうございます
JOINを使って結合していくんですね
うまく抽出が出来ました

>>967さん
人事関係のデータベースで個人情報の部分のテーブルと取得資格のテーブルが分かれていて
○○の資格を持っている人の一覧だけなら取得資格のテーブルとの結合だけで良いんですが
○○の資格を持っている人は他にどんな資格を持っているかも表示を行いたかったんです

資格○○を持っている人の情報
<NAME>□□□</NAME><SKIL1>○○</SKIL1><SKIL2>▽▽</SKIL2>
<NAME>▲▲</NAME><SKIL1>○○</SKIL1>

こんな感じです(^-^;
970NAME IS NULL:2005/07/14(木) 20:19:28 ID:???
>>969
どーでもよい話だが人事関係のDBをさくらのレンサバに預けるのも
ある意味凄いな。怖くないか?
971NAME IS NULL:2005/07/14(木) 22:52:11 ID:???
>>961
本番データは、MySQL本体とは別の共通ディレクトリに
置けばいいじゃん。
972NAME IS NULL:2005/07/15(金) 02:06:21 ID:0pzFxJt7
>>961
データとサーバのバージョンは分けて考える。>>971のいうように共通ディレクトリがいいのかも。

4.0系から4.1系にあげるときのようにファイルフォーマットが代わる場合には新しいディレクトリが必要。
(確か変わるよね?)
973NAME IS NULL:2005/07/15(金) 09:19:06 ID:???
んー、4.0から4.1にするんなら同じデータ使えるよ。
逆だとあんまり良くないけど。
974NAME IS NULL:2005/07/15(金) 12:02:10 ID:???
4.0と4.1ってめちゃくちゃかわってるとおもわれ
975NAME IS NULL:2005/07/15(金) 21:27:08 ID:y8eO46wK
csvのデータをDBに保存するのですが、どうせなら利用しやすくしようと思って、
カラムごとに作ってみたのですが、

create table csv(
 _1 varchar(255),
 _2 varchar(255),
 _3 varchar(255),
 ・・・
);

と、どんどん増やして sql を発行したら以下のように怒られてしまいました。

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs

まあ、そりゃそうだなという感じなのですが、csvを保存するのに何か良い案は無いでしょうか?
(mysql 4.1.11)
976NAME IS NULL:2005/07/15(金) 22:04:56 ID:???
誤り1118(42000): 大き過ぎる状態でサイズをこいでください。 BLOBsを数えないで、
中古のテーブルタイプに、最大の列のサイズは65535です。 あなたはいくつかのコラムを
TEXTかBLOBsに変えなければなりません。
977NAME IS NULL:2005/07/15(金) 22:31:21 ID:???
コラム吹いた
978NAME IS NULL:2005/07/15(金) 22:42:50 ID:???
>>974
ん? 現に使ってますが。
ISAM形式の奴が残ってて、それだけは駄目だったけど。
(コンパイルオプションに入れなかったから)

ま、いまさらISAMなテーブルが残ってるほうが問題ですが。

979NAME IS NULL:2005/07/15(金) 22:52:40 ID:???
>>977
野暮なツッコミで申し訳ないがcolumnをコラムと読もうがカラムと読もうがどっちでもいい。
DB界隈ではカラムと読む方が一般的だけど。
980NAME IS NULL:2005/07/15(金) 23:13:58 ID:???
4.1って強制UTF8のせいで
マルチバイトキャラクタがテーブル名や列名にはいると互換性なくなってなかったか?
981NAME IS NULL:2005/07/15(金) 23:21:23 ID:???
>>979
読む場合はどっちでもいいけど、書くときはコラムだと嫌だな
982NAME IS NULL:2005/07/16(土) 01:09:44 ID:???
そろそろ次スレの季節ですね

■関連スレは
http://find.2ch.net/index.php?BBS=ALL&TYPE=TITLE&STR=MySQL&COUNT=50

で手抜きしていいんでないの
983NAME IS NULL:2005/07/16(土) 03:21:45 ID:???
phpmyadminにある「次の行を編集する」みたいに、
自動的に次のレコードを表示させる・・・ような関数って無い?
984NAME IS NULL:2005/07/16(土) 09:39:37 ID:???
テーブル名や列名をascii以外にはしない。
コーディングするとき面倒くさいから。
985NAME IS NULL:2005/07/16(土) 14:23:36 ID:???
毎日 row がある程度増えて行くんですが、unique 性があればいいのは一定時間だけなんです。
こう言う場合は primal key ってどうすればいいんでしょうか?
Oracle 使いに聞いたら、循環する int を使えと言われたんですが、
MySQL にそんなのありますか??
986NAME IS NULL:2005/07/16(土) 16:18:24 ID:GKvS+qiJ
>>985
auto_incrementを使う
987985:2005/07/16(土) 16:30:00 ID:???
>>986
ネタ?
ちなみに mysql では 各column の値が定義領域を超えると、
最大値に丸められます。
988NAME IS NULL:2005/07/16(土) 18:00:31 ID:???
なにこいつ
989NAME IS NULL:2005/07/16(土) 23:19:48 ID:NbSXfESe
MySQL4.1で、文字コードを「ujis_japanese_ci」にして、PHPからEUC-JPの文字列を
登録したら、データが壊れて登録してしまいます。

どのようにデータを登録すればいいのでしょうか?
990NAME IS NULL:2005/07/16(土) 23:23:47 ID:???
>>989
どのようなデータを登録すると、どのように壊れたデータが
登録されたのかを書きなはれ。世の中エスパーばかりでは
ないんで。
991NAME IS NULL:2005/07/16(土) 23:31:06 ID:???
985がネタだろ
992NAME IS NULL:2005/07/16(土) 23:32:32 ID:???
つか>>987がネタ。
嘘つくな。
993NAME IS NULL:2005/07/16(土) 23:33:07 ID:???
んー、
CREATE TABLE example (
date date not null,
uid int unsigned not null auto_increment,
unique (date, uid)
)

とかは?
994989:2005/07/16(土) 23:35:02 ID:???
失礼。

文字列(文字コードEUC-JP)
「東京都|大阪府|愛知県」

SELECTで表示させたデータ(文字コードEUC-JP)
「東??」

ブラウザで見ると、?と黒い菱形の中に?があるものが所々ある。
単純に文字コードがEUCではなくて、UTFとかで入っているのかと
思ったけど、そうではないみたい(色んな文字コードに変換してみたけど駄目だった)
995NAME IS NULL:2005/07/17(日) 01:25:40 ID:???
Update で join って出来る?
996990:2005/07/17(日) 06:08:59 ID:???
>>994
MySQLサーバーとクライアント間の文字コードが合っていないと
思われ。
PHPでMySQLに接続後、SET NAMES UJISを送る処理を追加すれば
直ると思うよ。
997NAME IS NULL:2005/07/17(日) 09:46:26 ID:???
998NAME IS NULL:2005/07/17(日) 12:34:49 ID:???
998
999NAME IS NULL:2005/07/17(日) 12:42:18 ID:k8NW5frL
999
1000NAME IS NULL:2005/07/17(日) 12:42:55 ID:???
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。