のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,062,295人
昨日:no data人
今日:
最近の注目
人気の最安値情報

    私的良スレ書庫

    不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitter
    ログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。

    元スレMySQL 総合 Part12

    mysql スレッド一覧へ / mysql とは? / 携帯版 / dat(gz)で取得 / トップメニュー
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
    レスフィルター : (試験中)
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
    401 : NAME IS - 2007/11/21(水) 11:39:25 ID:??? (-29,-29,-53)
    >>356
    で、そのEnterpriseなVersionの正式にライセンス契約してない貧乏泥棒ユーザーが、
    本家にBugReport送るのってありですか?
    402 : 395 - 2007/11/21(水) 12:05:39 ID:??? (-28,-30,-145)
    >>398
    テーブル構成は住所録+沿線情報になりまして、
    aテーブルには基本情報(user_id、pref、address)
    bテーブルには会員の駅情報(user_id、ensen_id、station_id)
    cテーブルには参照する駅情報(ensen、ensen_id、station、station_id)

    こういう構成です。()内はフィールド名です。各1万件あります。
    SELECT * FROM a LEFT JOIN b ON a.user_id=b.user_id
    LEFT JOIN c ON b.station_id=c.station_id

    みたいなSQLで結合しているのですが、これが非常に重いです。
    インデックスは各idごとに付けています。

    MySQLのバージョンは会社では4.0.20なので、合わせています。
    だからすぐに捨てることは出来ないので、それが問題です。
    404 : NAME IS - 2007/11/21(水) 12:45:10 ID:??? (+9,+30,+0)
    405 : NAME IS - 2007/11/21(水) 13:17:45 ID:??? (+0,-10,-33)
    >>402
    そのSQLとexplainの結果をそのまま貼り付けよー
    結合しているせいじゃない気がするよ
    407 : NAME IS - 2007/11/21(水) 16:01:19 ID:??? (+0,+0,+0)
    権限テーブルについて質問です。

    したいこと -->
    'hoge'と言う、root権限から、grant と mysqlデータベースについてのアクセス権のみ省いたUserを作成したい。
    ちなみに、この’hoge’は、LAN内からののみアクセス可能とする(192.168.0.%)

    やったこと -->
    rootでloginして、
    grant all on *.* to 'hoge'@'192.168.0.%' identifed by '******';
    とやって、こんなUserができた。

    select * from mysql.user where user = 'hoge'

    Host: 192.168.0.%
    User: hoge
    Password: ******
    Select_priv: Y
    Insert_priv: Y
    Update_priv: Y
    Delete_priv: Y
    Create_priv: Y
    Drop_priv: Y
    Reload_priv: Y
    Shutdown_priv: Y
    Process_priv: Y
    File_priv: Y
    Grant_priv: N
    References_priv: Y
    Index_priv: Y
    Alter_priv: Y
    Show_db_priv: Y
    Super_priv: Y
    Create_tmp_table_priv: Y
    Lock_tables_priv: Y
    Execute_priv: Y
    Repl_slave_priv: Y
    Repl_client_priv: Y
    Create_view_priv: Y
    Show_view_priv: Y
    Create_routine_priv: Y
    Alter_routine_priv: Y
    Create_user_priv: Y
    ssl_type:
    ssl_cipher:
    x509_issuer:
    x509_subject:
    max_questions: 0
    max_updates: 0
    max_connections: 0
    max_user_connections: 0
    408 : つづき - 2007/11/21(水) 16:01:51 ID:??? (+0,-30,+0)
    で、一旦quitしてから、’hoge’で再loginしてから、
    show databases; や select * from mysql.user; するとmysqlデータベースの中身が参照できる(あたりまえ。)

    ここまではいいとして、ここから、再度rootでloginしなおして、

    revoke all on mysql.* from 'hoge'@'192.168.0.%';
    とやってみたら、こんなError
    ERROR 1141 (42000): There is no such grant defined for user 'hoge' on host '192.168.0.%'

    そりゃあhogeにはgrant option与えてないけど、なんで? Revokeの使い方間違ってる?

    そこで、

    Insert into mysql.db Values('192.168.0.%','mysql','hoge','N','N'・・・'N');
    でmysql.dbテーブルに直接インサートしてみた。

    select * from mysql.db where user = 'hoge':
    Host: 192.168.0.%
    Db: mysql
    User: hoge
    Select_priv: N
    Insert_priv: N
    Update_priv: N
    Delete_priv: N
    Create_priv: N
    Drop_priv: N
    Grant_priv: N
    References_priv: N
    Index_priv: N
    Alter_priv: N
    Create_tmp_table_priv: N
    Lock_tables_priv: N
    Create_view_priv: N
    Show_view_priv: N
    Create_routine_priv: N
    Alter_routine_priv: N
    Execute_priv: N

    となったので、flush privileges をかけて、rootはlogout。再びhogeでログイン。
    そこで、show databases や show tables from mysql をしたら、中が読めてしまう。
    MySQL Serverを再起動掛けて見てもやっぱり同じ。
    (これでmysql.*が読めないようにすることが目的)

    これってやっぱり、最初のgrantの時に、一つ一つDbを明示して権限を与えないとダメですか。
    出来れば、既存の権限から、特定のDbだけ除外したい。

    実のことを言うと、BackUp用に、他のマシンから各Db、Tableの内容をdumpしたいんだけど、
    例えば本番マシン内で、新たにDbが作成されたりした時に、いちいちlocalコンソールからloginして、
    増えたDbの分だけgrantしたり、消去されたDbについてRevorkeしたりすんのが煩雑なのと、
    DBをフルダンプした時に、mysqlデータベース内の権限テーブルまで吐いてしまうのを回避したい。
    409 : NAME IS - 2007/11/21(水) 16:36:37 ID:??? (+39,+29,-120)
    >>401

    バグだって切り分けができてるなら
    http://bugs.mysql.com/ へのレポートしてOK。
    Enterpriseのソースはbitkeeperにも置いてあるから、
    別に入手元は問われないよ。
    対応はベストエフォートだけど、これはしょうがない。

    契約顧客は専用のサポートサイトがあって、
    そちらにレポートするときちんと担当者がアサインされて
    障害の切り分けから直すところまでつきあってくれる。
    410 : NAME IS - 2007/11/21(水) 16:52:40 ID:??? (+0,+28,-2)
    >>407
    なげーよ。
    411 : 409 - 2007/11/21(水) 16:52:48 ID:??? (-27,-30,-48)
    BitKeeperはこちら。
    http://mysql.bkbits.net/

    ちなみに、しつこくバグレポートしてると、
    そのうちMySQL Quality Contributorとして認定してくれます。
    MySQL Quality Contributorになると
    MySQL Enterpriseのライセンスがタダでもらえます。
    413 : NAME IS - 2007/11/21(水) 17:18:33 ID:??? (+0,-30,-27)
    >>407
    grant usage on mysql.* to 'hoge'@'192.168.0.%' identifed by '******';
    grant all on *.* to 'hoge'@'192.168.0.%';
    414 : NAME IS - 2007/11/21(水) 17:28:41 ID:??? (-27,-30,-177)
    mysqld の起動時、すべての権限がメモリに読み込まれます。
    データベース権限、テーブル権限、およびカラム権限はすぐに反映されますが、
    ユーザレベルの権限はユーザが次回接続したときに有効となります。
    GRANT または REVOKE によって行われた権限テーブルへの変更については、サーバは即座に認識します。
    INSERT、UPDATE などを使って手動で権限テーブルを変更した場合、
    FLUSH PRIVILEGES ステートメントまたは mysqladmin flush-privileges を実行して
    サーバに権限テーブルを再読み込みさせる必要があります。
    See 項4.4.3. 「権限の変更はいつ反映されるか」。
    416 : NAME IS - 2007/11/21(水) 18:01:30 ID:??? (+0,+27,+1)
    ごめんアンカミス。>>407, >>408
    417 : 407,408 - 2007/11/21(水) 19:46:21 ID:??? (+0,-30,+0)
    いろいろとレスサンクス。

    >>414
    上にも書いてあると思うけど、flush privilegesは何回もしてる。
    mysqldの再起動もやった。

    >>412,415
    Revorkの使い方間違ってるのは理解した。
    (ってか今までは、ほとんど delete from mysql.user where user='***' で一旦削除してから、あらたにgrantしてた。)

    >>413
    上の行のクエリで、mysql.userの*_privが全部'N'のhogeができあがった。
    でも、そこから下の行のクエリを書けたら、*_privが全部(grant_priv以外)’Y’になった。
    で、flush privileges(念のため)を掛けてから、hogeで再ログインして、
    show databases と show tables from mysql でやっぱりmysql.の中身が読めてしまう。

    ちなみに、この時(上の行の前、後、下の行の後のいつでも)
    select * from mysql.db where user='hoge'; で Enpty set が返ってくる(つまりHitなし)
    select * from mysql.db where db='mysql'でも Enpty set。

    ちなみに、grant all on my_db1.* to 'piyo'@'192.168.%' identifed by '******'; で作ったUserでloginして
    show databases; したら、ちゃんと infomation_schemaとmy_db1しか表示されないし、
    show tables from mysql; だと、Access denied for user 'piyo'.... となる(期待した動作)
    select * from mysql.db where user='piyo' で、db権限テーブルには’piyo’がちゃんと登録されてる。

    う~ん、デフォルトが’Y’で指定したのみ’N’ってのは、できないのかなあ~。
    418 : 395 - 2007/11/21(水) 20:09:50 ID:??? (+0,+0,+0)
    >>405
    とりあえず、EXPLAINは以下の通りです。
    長いですけど、絶えずUsing index; Using temporary; Using filesortが出ます。

    Array ( [0] => a [table] => a [1] => index [type] => index [2] => [possible_keys] => [3] => PRIMARY [key] => PRIMARY
    [4] => 4 [key_len] => 4 [5] => [ref] => [6] => 20292 [rows] => 20292
    [7] => Using index; Using temporary; Using filesort [Extra] => Using index; Using temporary; Using filesort )
    Array ( [0] => b [table] => b [1] => ALL [type] => ALL [2] => user_id [possible_keys] => user_id
    [3] => [key] => [4] => [key_len] => [5] => [ref] => [6] => 4 [rows] => 4 [7] => [Extra] => )
    Array ( [0] => c [table] => c [1] => ref [type] => ref [2] => station_id [possible_keys] => station_id
    [3] => station_id [key] => station_id [4] => 4 [key_len] => 4 [5] => b.station_id [ref] => b.station_id
    [6] => 1 [rows] => 1 [7] => [Extra] => )
    419 : NAME IS - 2007/11/21(水) 20:35:32 ID:??? (+48,+29,-90)
    オレって実際には全カラムは必要ない時にも select * でクエリしちゃったりする。
    一般的にこれってやっぱ無駄というか、パフォーマンスに影響するのかな。
    簡単なテストでは大差なかった。
    テーブルの型やドライバとかに影響しそうだけど、10個中9個取るときも必要な
    カラムを羅列すべきだと思う?
    420 : NAME IS - 2007/11/21(水) 20:43:16 ID:??? (-24,-29,-64)
    インデックスが作ってあって、そのインデックスの列だけSELECTする場合、

    SELECT * ⇒ インデックスとテーブルにアクセスする
    SELECT [必要な列のみ] ⇒ インデックスのみアクセスする

    となるので性能にずいぶん影響が出るよ。

    あとは通信量が違う
    421 : NAME IS - 2007/11/21(水) 21:52:53 ID:??? (+35,+29,-38)
    >>419
    羅列するべき。 メリットなんてSQLで手抜ける ってぐらいじゃない。
    デバッグ時は * で開発進める場合もあるけど、必ず仕上げ段階で
    カラムを絞りますよ。
    422 : 419 - 2007/11/21(水) 22:26:02 ID:4Hr0oFqs (+25,+29,-1)
    >>420
    >>421
    ありがと。これからはちゃんと羅列するようにしまっす。
    423 : NAME IS - 2007/11/21(水) 23:12:08 ID:??? (+0,+29,-18)
    >>418
    これは何かの嫌がらせか……
    人間が読める形にしてよ。
    424 : NAME IS - 2007/11/21(水) 23:54:00 ID:??? (-27,-30,-137)
    select hoge1.fuga, hoge1.hage, hoge2.fuga, hoge2.hage
    from hoge as hoge1 left join hoge as hoge2 on hoge2.fuga = hoge1.fuga
    みたいなことってよくする?
    426 : 407,408 - 2007/11/22(木) 04:21:02 ID:??? (+0,-30,+0)
    >>レスくれた方々
    色々なヒントをありがとう。

    たぶんできた。

    grant usage on *.* to 'hoge'@'192,168.0.%' identified by '******';
    これで、mysql.userに*_privが全NのUserができる。この時点で、まだmysql.dbにはなにも追加されてない。

    Insert into mysql.db (`Host`,`Db`,`User`) Values('192.168.0.%','mysql','hoge');
    これで、mysql.dbにUser:hoge,db:mysql,*_priv:Nのレコードが追加される。

    Insert into mysql.db Values('192.168.0.%','mysql','hoge','Y','Y','Y'・・・'Y');
    これで、mysql.dbにUser:hoge,db:%,*_priv:Yのレコードが追加される。(つまりUser:hogeのレコードが二件存在する)

    すかさず、flush privilegesで権限テーブルをflushして、hogeで再ログインすると・・・、

    ついに期待通りの動作確認!!。
    show databases;でmysql以外のDbが一覧で返ってきて、show tables from mysqlだと、Access denied。
    とにかくhogeからはmysql Dbが完全に遮断できた。
    この時に、別のターミナルからログインして、新しくDbやTableを作成しても、すかさずhoge側から参照可能。

    Manualの4章あたりを何度も読み返して、なんとなくだけど接続、参照時の権限のイメージみたいなが見えてきた。
    >>415さんの言ってるように、最初の接続時にmysql.userテーブルを読んで、そこでアクセス権があれば
    それをセットする(グローバル設定)。なければそれぞれのDb権限を読みに行って、Dbごと(あるいはTable、columnsごとに)
    権限を制御している模様。

    で、Db名を明示してgrantしたUserのmysql.userを覗いてみると、なんと全てのprivが’N’になってんで、もしやと思ってやってみた。
    実は今までこれ知らなかった。

    ManualにはUser名にはワイルドカード使えないとは書いていたけど、その他については特に記述なし。
    で、ここの少し上の方のレスで、Db名には’%’が使えそうだと思って、放り込んでみたら、できた。
    ワイルドカードより、完全一致のほうが強いようだ。
    (バージョンや環境によって変わるかも?でも他のやりかたがあるんだったら教えて。自分にはこれ以上思いあたらん)

    ちなみに、grant all on *.* to・・・ だと、mysql.userの中身を全てYに変えてしまう。
    grant all on `%.*` だとsyntax error。
    grant all on `%`.`*` だと Query Ok にはなるけれど、mysql.dbにはなにも追加されない。(mysql.userも変更なし)

    結局 Insert into ・・・・で、たくさん’Y’を打ち込まないといけない。(これがVersionによって数が異なる)

    期待通りに動作したもの
    確認済み・・・4.0.26-Win32、4.0.27-Win32、5.0.37-Win32、5.0.45-Win32、5.0.45(Cent4)、5.0.50(Cent4)
    これから確認・・・5.0.50-Win32、5.0.22-rpm(Cent5)、5.0.27-rpm(FC6)
    4.1系、5.1系は持ってないから知らない。(これだけやってどれも期待通りに行ったから、多分大丈夫だとは思うけど・・)

    とりあえず寝よう。
    427 : NAME IS - 2007/11/22(木) 05:37:50 ID:??? (+22,+29,-2)
    寝るとこまでは読んだ
    428 : NAME IS - 2007/11/22(木) 07:33:12 ID:v2xY2Xgx (+0,-30,-75)
    grant usage on *.* to 'hoge'@'192,168.0.%' identified by '******';
    Insert into mysql.db (`Host`,`Db`,`User`) Values('192.168.0.%','mysql','hoge');
    Insert into mysql.db Values('192.168.0.%','mysql','hoge','Y','Y','Y'・・・'Y');

    3行目まちがってないか
    432 : 407,408 - 2007/11/22(木) 11:34:02 ID:??? (+0,+0,+0)
    ちょっと前まで寝てた。

    >>428,429,430
    !!!。おっしゃるとおり、三行目は
    Insert into mysql.db Values('192.168.%','%','hoge','Y','Y','Y',・・・'Y'); のまちがいでした。
    >>426のクエリなら、せっかく’N’にした`mysql`での権限を、’Y’にしてしまう。

    で、show grants for 'hoge'@'192.168.0.%;'の結果
    GRANT USAGE ON *.* TO 'hoge'@'192.168.0.%' IDENTIFIED BY PASSWORD '******'
    GRANT ALL PRIVILEGES ON `%`.* TO 'hoge'@'192.168.0.%'

    desc mysql.db; (多分ズレまくりだけどかにんして・・・)
    Field        | Type     | Null | Key | Default | Extra
    ----------------------+---------------+------+-----+---------+------
    Host        | char(60)   | NO | PRI | |
    Db         | char(64)   | NO | PRI | |
    User        | char(16)   | NO | PRI | |
    Select_priv    | enum('N','Y') | NO | | N |
    Insert_priv    | enum('N','Y') | NO | | N |
    Update_priv   | enum('N','Y') | NO | | N |
    Delete_priv    | enum('N','Y') | NO | | N |
    Create_priv    | enum('N','Y') | NO | | N |
    Drop_priv     | enum('N','Y') | NO | | N |
    Grant_priv     | enum('N','Y') | NO | | N |
    References_priv | enum('N','Y') | NO | | N |
    Index_priv     | enum('N','Y') | NO | | N |
    Alter_priv     | enum('N','Y') | NO | | N |
    Create_tmp_table_priv | enum('N','Y') | NO | | N |
    Lock_tables_priv | enum('N','Y') | NO | | N |
    Create_view_priv | enum('N','Y') | NO | | N |
    Show_view_priv  | enum('N','Y') | NO | | N |
    Create_routine_priv | enum('N','Y') | NO | | N |
    Alter_routine_priv | enum('N','Y') | NO | | N |
    Execute_priv    | enum('N','Y') | NO | | N |

    Version 5.0.50-Win32 今試したけど、このVerも期待通りに動いた。
    *_privの数が、4.0系で12個、5.0系で17個。多分4.1系、5.1系だとまた違うハズ・・。
    436 : NAME IS - 2007/11/22(木) 16:27:04 ID:??? (+6,+18,+0)
    スレが違う
    439 : NAME IS - 2007/11/22(木) 17:19:37 ID:??? (-18,+0,+1)
    >>434
    できない。
    440 : NAME IS - 2007/11/22(木) 17:44:11 ID:??? (+17,+19,-18)
    正規表現にしてマッチした回数でソートすれば出来るような気がするんだけど
    442 : NAME IS - 2007/11/22(木) 18:37:22 ID:??? (+13,+25,+0)
    うん
    447 : NAME IS - 2007/11/23(金) 01:22:20 ID:??? (-27,-29,-9)
    insert into table (name1) values (1)
    448 : NAME IS - 2007/11/23(金) 02:05:55 ID:OYGbXtrw (+0,+30,-82)
    >>447
    ありがとうございます
    やっぱりそういう風に値の入ってるものだけに絞ってインサートするしかないんでしょうか?
    そうだとすると各パラメータの値の有無ごとに振り分けが必要になって面倒な気がしますが…
    449 : NAME IS - 2007/11/23(金) 03:15:05 ID:??? (-4,-30,-44)
    >>448
    Insert into table (`namae1`) Valuse('1')
    Insert into table (`namae3`,`namae256`) Valuse('konyaga','YamaDa!!')

    これが>>446とどうちがうか理解できなければ、Manualを熟読しませう。
    450 : 449 - 2007/11/23(金) 03:16:38 ID:??? (+20,+29,-15)
    ごめ、アンカミス
    >>446>>447の間違い
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / mysql スレッド一覧へ
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

    類似してるかもしれないスレッド


    トップメニューへ / →のくす牧場書庫について