IT家・挑戦雑記

情報を制する者は世界を制す!

Archive for the ‘データベース’ Category

CentOSサーバーのMySQLをyumコマンド(remiパッケージ)を用いてmysqlをアップグレードを行った後、
MySQLのサービスが起動しなくなるトラブルが発生!
その解決した方法を紹介します。

★状況
 ・MySQLをアップグレード(5.1系 -> 5.5系をremiパッケージにて)
 ・MySQLサービスが起動しない。

★環境
 ◆サーバーサイド
  ・OS:CentOS 5.6
   ・PHP:5.3.x
   ・Apache:2.2.x
   ・MySQL:5.5.x

★原因
 ・MySQL5.5系において廃止されたシステム変数「record_buffer」がmy.cnfに記述されていたため!

★解決
 ・my.cnfを変更
  ※「#record_buffer = 8M」をコメントとアウト
 ※my.cnfの原因を特定できない場合は、一度my.cnfをリネームして、my.cnfなしでサービスを起動できるかチェックし、起動したらmy.cnfの記述のどこに問題があるか切り分ければよい。

★備考
 ◆サービスを再起動時のエラーメッセージ
  [root@user ~]# service mysqld restart
  mysqld を停止中: [ OK ]
  MySQL Daemon failed to start.
  mysqld を起動中: [ 失敗 ]

 ◆起動しなかった際のMySQLのログ(/var/log/mysql)
  110417 18:12:07 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
  110417 18:12:07 [Warning] option ‘table_cache’: unsigned value 33554432 adjusted to 524288
  110417 18:12:07 [Warning] Changed limits: max_open_files: 1024 max_connections: 151 table_cache: 431
  110417 18:12:07 [Note] Plugin ‘FEDERATED’ is disabled.
  /usr/libexec/mysqld: Table ‘mysql.plugin’ doesn’t exist
  110417 18:12:07 [ERROR] Can’t open the mysql.plugin table. Please run mysql_upgrade to create it.
  110417 18:12:07 InnoDB: The InnoDB memory heap is disabled
  110417 18:12:07 InnoDB: Mutexes and rw_locks use InnoDB’s own implementation
  110417 18:12:07 InnoDB: Compressed tables use zlib 1.2.3
  110417 18:12:07 InnoDB: Using Linux native AIO
  110417 18:12:07 InnoDB: Initializing buffer pool, size = 128.0M
  110417 18:12:07 InnoDB: Completed initialization of buffer pool
  110417 18:12:07 InnoDB: highest supported file format is Barracuda.
  110417 18:12:07 InnoDB: Waiting for the background threads to start
  110417 18:12:08 InnoDB: 1.1.6 started; log sequence number 2952637
  110417 18:12:08 [ERROR] /usr/libexec/mysqld: unknown variable ‘record_buffer=8M’
  110417 18:12:08 [ERROR] Aborting
  
  110417 18:12:08 InnoDB: Starting shutdown…
  110417 18:12:09 InnoDB: Shutdown completed; log sequence number 2952637
  110417 18:12:09 [Note] /usr/libexec/mysqld: Shutdown complete
  
  110417 18:12:09 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended”mysqld.log” 1314L, 95950C

 ◆調査でご利用させていただいたサイト
  ・[sakaikの日々雑感~(T)編] [mysql]MySQL 5.5.3-m3 で廃止になった変数やオプションなどを整理しました
  ■今回は利用しなかった他の解決方法?
  ・[質問掲示板 – CentOSで自宅サーバー構築] MySQL5.1.41が起動できない

★状況
 ・WordPressで記事を投稿しても、RSSが更新されない。

★環境
 ◆サーバーサイド
  ・OS:CentOS 5.5
   ・PHP:5.3.x
    ・WordPress 3.1
   ・Apache:2.2.x
   ・MySQL:5.1.x

★原因
 ・キャッシュ生成プラグイン『Quick Cache』によるキャッシュファイルが生成されていたために、最新のRSS情報が表示されなかった。

★解決
 ・RSSをキャッシュの対象外に指定。
  ※RSSのURIである「feed」を除外

●WordPressの管理画面

●キャッシュ生成プラグイン『Quick Cache』の設定

WordPressを利用していると
このページにアクセスするための十分なアクセス権がありません
と怒られてしまうケースがあります。

私の場合、システムログイン後にこのメッセージが出ました。

その状況や原因を以下にて解説します。

━━━━━━━━━━━━━━━━━━━━━━━━━
★状況
 ・テーブルのprefix名を変更

 DBテーブルとwp-config.phpのprefix名を変更した際、
 WordPressで管理画面にIDとパスワードを入力してログイン後、
 「このページにアクセスするための十分なアクセス権がありません」
 とうい警告メッセージが表示される。
 ※管理画面で操作不可
 ※ブログ閲覧は問題なし

★環境
 ◆サーバーサイド
  ・OS:CentOS 5.5
   ・PHP:5.3.3
    ・WordPress 3.01
   ・Apache:2.2.3
   ・MySQL:5.1.50-1

 ◆WordPressのテーブル一覧(全11テーブル)
  1: (prefix名)_commentmeta
  2: (prefix名)_comments
  3: (prefix名)_links
  4: (prefix名)_options
  5: (prefix名)_postmeta
  6: (prefix名)_posts
  7: (prefix名)_terms
  8: (prefix名)_term_relationships
  9: (prefix名)_term_taxonomy
  10: (prefix名)_usermeta
  11: (prefix名)_users
  ※(prefix名) ・・・ ユーザ指定のprefix名

★原因
 ・DBのテーブルprefixの変更が不十分

★解決
 テーブルprefix名を変更する際には、
  ・DBのテーブルprefix名を変更
  ・wp-config.phpのprefix名を変更
  ・以下の2テーブル内に存在するprefix名を変更
   1.(prefix名)_usermeta ・・・ フィールド:meta_key
   2.(prefix名)_options ・・・ フィールド:option_name
★やりたい事
 Accessで、他のDBを参照してリンクテーブルを作成する。

★環境
 ・WindowsXP SP3
 ・Access2003

★リンクテーブルを作成するための関数
 ※以下のオレンジの太文字を環境に応じて変更して下さい。
 ◆備考
  ・リンクテーブルが存在しない場合はリンクテーブルを作成
  ・同名のリンクテーブルが存在する場合は上書き(処理は削除して新規作成)

━━━━━━━━━━━━━━━━━━━━━━━━━
Public Function mk_tbl_link()

  '★参照ライブラリ ・・・ 以下を参照しないと動作しません。
    '・Microsoft ADO Ext 2.8 DLL And Security

  '---------------------------------------------
  '★変数宣言
    Dim cat As New ADOX.Catalog
    Dim tbl() As New ADOX.Table
    Dim linkMDB As String
    Dim linkMDB_path As String
    Dim linkMDB_file As String
    Dim linkTblNames() As String
    Dim i As Integer
    Dim tblNames As Variant

    Dim itemNum As Integer
    'リンクするテーブル数を入力。ただし、配列だから0からスタートに注意!
    itemNum = 6

    ReDim tbl(itemNum) As New ADOX.Table
    ReDim linkTblNames(itemNum) As String

  '---------------------------------------------
  '★値のセット
    linkMDB_path = "D:リンク先のパス"
    linkMDB_file = "リンク先のMDB.mdb"
    linkMDB = linkMDB_path & linkMDB_file
    i = 0
    cat.ActiveConnection = CurrentProject.Connection

    'リンクするテーブル名をセット
    linkTblNames(0) = "リンクするテーブル名1"
    linkTblNames(1) = "リンクするテーブル名2"
    linkTblNames(2) = "リンクするテーブル名3"
    linkTblNames(3) = "リンクするテーブル名4"
    linkTblNames(4) = "リンクするテーブル名5"
    linkTblNames(5) = "リンクするテーブル名6"
    linkTblNames(6) = "リンクするテーブル名7"

  '---------------------------------------------
  '★メイン処理
    For Each tblNames In linkTblNames
    '■各種設定
      Set tbl(i).ParentCatalog = cat
      tbl(i).Properties("Jet OLEDB:Create Link") = True
      tbl(i).Properties("Jet OLEDB:Link Datasource") = linkMDB

      'パスワード ・・・ 参照先DBにパスワードがある場合はここを記入
      'tbl(i).Properties("Jet OLEDB:Link Provider String") = ";pwd=リンク先のMDBのパスワード"

      'リンクしたテーブル名
      tbl(i).Name = tblNames

      'ソーステーブル名
      tbl(i).Properties("Jet OLEDB:Remote Table Name") = tblNames

    '■リンクテーブル処理
      For Each TB In cat.Tables
        If TB.Name = tblNames Then
          'テーブル削除
          cat.Tables.Delete tbl(i).Name
          Exit For
        Else
          '
        End If
      Next TB

      'リンクテーブル作成
      cat.Tables.Append tbl(i)

      'インクリメント
      i = i + 1
    Next tblNames

  'オブジェクトの破棄
  Set cat = Nothing
  Set tbl(itemNum) = Nothing

  '終了メッセージ
  MsgBox ("リンクテーブルの作成/更新が完了しました")

End Function
━━━━━━━━━━━━━━━━━━━━━━━━━

★やりたい事
 Accessで、リンクテーブルの参照先をVBAを用いて変更する。

★環境
 ・WindowsXP SP3
 ・Access2003

★リンクテーブルを変更するための関数
 ※以下の赤の太文字を環境に応じて変更して下さい。

━━━━━━━━━━━━━━━━━━━━━━━━━
Public Function ch_tbl_link()

  '★参照ライブラリ ・・・ 以下を参照しないと動作しません。
    '・Microsoft DAO 3.6 Object Library

  '-------------------------------------------------------------------
  '★変数宣言
    Dim tdf As TableDef
    Dim dbs As Database

  '-------------------------------------------------------------------
  '★オブジェクトセット
    Set dbs = CurrentDb
    Set tdf = dbs.TableDefs("リンクテーブル名")

  '-------------------------------------------------------------------
  '★メイン処理

    'プロパティ値の変更
    With tdf
      .Connect = ";DATABASE=D:リンク先のMDB.mdb;TABLE=リンクテーブル名"
      .RefreshLink
    End With

    '終了メッセージ
    MsgBox "リンクテーブルの変更が完了しました。"

    'オブジェクトの破棄
    Set tdf = Nothing
    dbs.Close: Set dbs = Nothing

End Function
━━━━━━━━━━━━━━━━━━━━━━━━━

以下のようなビットマスクを利用したテーブルを作成した時、
それを抽出するためのSQL文を紹介します。

■対象のテーブル
 
 テーブル名:名産
 100308-01

■SQLサンプル

 ◆「お茶」と「わさび」のレコードを抽出する場合
  
  ・[1.a] ORを使用した抽出方法
   SELECT `名産`.項目
   FROM `名産`
   WHERE `ID(ビット値)` = 1 OR WHERE `ID(ビット値)` = 4
  
  ・[1.b] ビット値を条件にした抽出方法
   SELECT `名産`.項目
   FROM `名産`
   WHERE `ID(ビット値)` & 5
  
  ・抽出結果([1.a],[1.b]共に同じ)
   
   お茶
   わさび
   
   ※[1.b]のwhere句の5(1+4)は、「お茶」=1, 「わさび」=4の合計値
 
 ◆「お茶」のレコードを抽出する場合
  
  ・[2.a] 通常??の抽出方法
   SELECT `名産`.項目
   FROM `名産`
   WHERE `ID(ビット値)` = 1
  
  ・[2.b] ビット値を条件にした抽出方法
   SELECT `名産`.項目
   FROM `名産`
   WHERE `ID(ビット値)` & 1
  
  ・抽出結果([2.a],[2.b]共に同じ)
   
   お茶

■ポイント!
 ビット値を条件に抽出を行う際には、&(アンパサンド)を利用する!