ロックテーブルサイズ超えのエラー対処

このQ&Aのポイント
  • “ERROR 1206 (HY000): The total number of locks exceeds the lock table size”エラーが発生する場合の対処方法について教えてください。
  • /etc/my.cnfの“innodb_buffer_pool_size”を大きくするのが解決策ですので innodb_buffer_pool_size = 2G のように最大値に変更してみましたが、解決しませんでした。 一応、 max_connections も減らしてみましたが、解決しません。 PHPからMySQLにコネクションを接続し続けて切断するような処理はしていませんが、問題ありますでしょうか?(最初にmysql_connectで接続し、プログラムが終了するまで、何回もmysql_queryでSQL文(SELECTやUPDATE等)を実行しています。) 一概に言えませんが、データベースをバックアップでテキストで出力しても、300Mbyteくらいのデータですが、2Gのメモリを使うのでしょうか?
  • 物理メモリを増やして innodb_buffer_pool_size を増やすしか解決方法がないのかご教授頂きたいです。 (ロックするテーブルは同時に1個しかしていないです。) 詳細な内容は提示していないので、わかりにくいですが、ご指摘頂ければ提示します。 設定や状態確認や見ておくべき点などが提案ベースでも教えて頂ければ幸いです。 すいませんがよろしくお願いします。
回答を見る
  • ベストアンサー

ロックテーブルサイズ超えのエラー対処

“ERROR 1206 (HY000): The total number of locks exceeds the lock table size”エラーが発生する場合の対処方法について教えてください。 /etc/my.cnfの“innodb_buffer_pool_size”を大きくするのが解決策ですので innodb_buffer_pool_size = 2G のように最大値に変更してみましたが、解決しませんでした。 一応、 max_connections も減らしてみましたが、解決しません。 PHPからMySQLにコネクションを接続し続けて切断するような処理はしていませんが、問題ありますでしょうか?(最初にmysql_connectで接続し、プログラムが終了するまで、何回もmysql_queryでSQL文(SELECTやUPDATE等)を実行しています。) 一概に言えませんが、データベースをバックアップでテキストで出力しても、300Mbyteくらいのデータですが、2Gのメモリを使うのでしょうか? 物理メモリを増やして innodb_buffer_pool_size を増やすしか解決方法がないのかご教授頂きたいです。 (ロックするテーブルは同時に1個しかしていないです。) 詳細な内容は提示していないので、わかりにくいですが、ご指摘頂ければ提示します。 設定や状態確認や見ておくべき点などが提案ベースでも教えて頂ければ幸いです。 すいませんがよろしくお願いします。

  • MySQL
  • 回答数2
  • ありがとう数10

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>ロックは複数のプロセスから同時にアクセスしないよう トランザクションで処理すればいいだけでは? innoDBでテーブルロックは普通はあり得ない運用スタイルです

yamakiyo2
質問者

お礼

なるほど、ありがとうございます。 通常はロックしないんですね。 ちないにロックを外してSQLのUPDATE単体で実行しても 同じでした。 バックアップは良く見ると800Mbyteありましたが、 メモリの2Gまでの容量はありませんでした。 ありがとうございました。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

ちなみにそのテーブルは本当にinnoDBなのでしょうか? (myISAMとかその他エンジンではない?) またinnoDBを利用していてなぜテーブルロックする必要があるのでしょうか?

yamakiyo2
質問者

補足

連絡ありがとうございます。 まず、innoDBでした。SQL文で全テーブル確認しました。 あと、ロックは複数のプロセスから同時にアクセスしないようにロックしています。 作りは見直すのは大変ですので、何かあれば教えて頂けばと思います。

関連するQ&A

  • mysqldが実行できない

    mySQLが起動しなくて困っています。環境はwindows7です。 以下にエラーまでの手順を書かせていただきます。 (1)コマンドラインでmysqldを実行する (2)ログファイルにエラーをはいて終了する。 以下にエラーログを貼り付けさせていただきます。また簡単なコメントも付加させていただきます。 120123 9:22:02 [Note] Plugin 'FEDERATED' is disabled. MySQL: Table 'mysql.plugin' doesn't exist ・・・(1) 120123 9:22:02 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it. ・・・(2) 120123 9:22:02 InnoDB: The InnoDB memory heap is disabled 120123 9:22:02 InnoDB: Mutexes and rw_locks use Windows interlocked functions 120123 9:22:02 InnoDB: Compressed tables use zlib 1.2.3 120123 9:22:02 InnoDB: Initializing buffer pool, size = 128.0M 120123 9:22:02 InnoDB: Completed initialization of buffer pool 120123 9:22:02 InnoDB: highest supported file format is Barracuda. 120123 9:22:02 InnoDB: Waiting for the background threads to start 120123 9:22:03 InnoDB: 1.1.8 started; log sequence number 1647042 120123 9:22:03 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist (1)これはデフォルトで出るものらしいので問題ないと思います (2)ここが主な原因だと思われます。また、ここに書かれているmysql_upgradeを実行するためにはmySQLを起動させなければいけないため、実質実行不可能です。 以上です。何かお気づきの点がありましたら助言いただけると幸いです。

    • ベストアンサー
    • MySQL
  • MySQL 肥大化したテーブルへのINSERT速度

    タイトルの件について、分かる方おりましたらどなたかご教授ください。 [DBサーバ] Linux CentOS 6.4 CPU Xeon core4 SSD 250GB RAM 32GB バージョン情報 MySQL 5.5 tomcat 6 JDK 6 会員データをCSVから大量にUSERテーブルへINSERTする処理を行っています。 また、それに関連するデータも同時にINSERTをします。 (USER_ID を持っている SERVICE_POINTテーブルやADDRESSテーブル) 処理の流れとしては以下となります。 (1) 会員情報の入ったCSVファイルをサーバへアップロード (2) 1でアップロードしたCSVファイルを○○○○件毎に一時ファイルに切り分ける ~~ ここからバックグラウンドで実行 ~~ (3) 2で切り分けたファイルをループで回しながら、メアドの重複やフォーマットエラーなどを判定する (4) 3でエラーがあれば即座にERRORSテーブルにエラー詳細をINSERTし、コミット&continue; (5) 3でエラーがなければUSERテーブル・SERVICE_POINTテーブル・ADDRESSテーブルへINSERT処理 (6) その他関連するテーブルへUPDATE処理 (7) 3に戻る ストレージエンジンは全てInnoDBです。 my.cnfのInnoDBの設定は以下の通りです。 innodb-buffer-pool-size = 24G innodb-log-buffer-size = 8M innodb-log-file-size = 1024M innodb_log_files_in_group = 3 innodb_fast_shutdown = 0 innodb_data_file_path = ibdata1:10M:autoextend innodb_file_io_threads = 4 innodb_change_buffering = all innodb_thread_concurrency = 16 innodb_flush_log_at_trx_commit = 2 innodb_max_dirty_pages_pct = 90 innodb_flush_method = O_DIRECT innodb_lock_wait_timeout = 120 innodb_additional_mem_pool_size = 128M innodb_file_format = Barracuda innodb_file_per_table = 1 なお、ERRORSテーブルのINSERTは非常に速いです。 会員数が全くない状態だとスムーズに登録されていくのですが (1秒に15件程度) テーブルが肥大化して20万件を超えると1秒に1件ほどしかINSERTされません。 この速度を少しでも速くしたいなと思っています。 1件ずつコミットしているのには理由があります。 ただ、1000件ずつコミットしても速度はほぼ変わりませんでした。 こういう場合、やはりパーティショニングを検討しなければならないでしょうか。 よろしければどなたかご教授ください。 以上、よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • MySQLの文字コードが変更されない

    お世話になっています。 EUCでPHPを書いています。 DBから取ったデータが文字化けしてしまいます。 全ての文字コードをujisにしたいのですが、変更できず困っています。 現在は以下のようになっています。 ――――――――――――――――――――――――――――――――――――― ■環境 Windows7(64bit) Mysql 5.5 ――――――――――――――――――――――――――――――――――――― ■my.iniのパス C:\ProgramData\MySQL\MySQL Server 5.5\my.ini ――――――――――――――――――――――――――――――――――――― ■サービスの起動パス "C:\Program Files\MySQL\MySQL Server 5.5\bin\mysqld" --defaults-file="C:\ProgramData\MySQL\MySQL Server 5.5\my.ini" MySQL55 (my.iniでポート変えたらCLIから接続できなくなったので、設定は反映していると思います。) ――――――――――――――――――――――――――――――――――――― ■my.ini [client] port=3306 default-character-set=ujis [mysql] default-character-set=ujis [mysqld] port=3306 character-set-server=ujis init-connect=SET NAMES ujis skip-character-set-client-handshake default-character-set=ujis default-storage-engine=INNODB sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" max_connections=100 query_cache_size=0 table_cache=256 tmp_table_size=10M thread_cache_size=8 myisam_max_sort_file_size=100G myisam_sort_buffer_size=69M key_buffer_size=55M read_buffer_size=64K read_rnd_buffer_size=256K sort_buffer_size=256K innodb_additional_mem_pool_size=3M innodb_flush_log_at_trx_commit=1 innodb_log_buffer_size=2M innodb_buffer_pool_size=107M innodb_log_file_size=54M innodb_thread_concurrency=10 [mysqldump] default-character-set=ujis skip-opt create-options set-charset hex-blob single-transaction ――――――――――――――――――――――――――――――――――――― ■コマンドラインからの確認 mysql> status; --------------------------------- Server characterset: utf8 Db characterset: utf8 Client characterset: ujis Conn. characterset: ujis ――――――――――――――――――――――――――――――――――――― 何かヒントを頂けないでしょうか。

  • MAMPでmysqldが起動できません!

    MAMPでmysqldが起動できません!macにアカウントが3つあるのですが、特定のアカウントでしか起動させることができません。エラーログを掲載しますので、どなたかお力をいただけないでしょうか? mysql_error_log.err ========== 140301 19:37:53 mysqld_safe Starting mysqld daemon with databases from /Applications/MAMP/db/mysql 140301 19:37:53 [Note] Plugin 'FEDERATED' is disabled. ・/Applications/MAMP/Library/bin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13) 140301 19:37:53 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it. 140301 19:37:53 InnoDB: The InnoDB memory heap is disabled 140301 19:37:53 InnoDB: Mutexes and rw_locks use GCC atomic builtins 140301 19:37:53 InnoDB: Compressed tables use zlib 1.2.3 140301 19:37:53 InnoDB: Initializing buffer pool, size = 128.0M 140301 19:37:53 InnoDB: Completed initialization of buffer pool 140301 19:37:53 InnoDB: highest supported file format is Barracuda. 140301 19:37:53 InnoDB: Waiting for the background threads to start 140301 19:37:54 InnoDB: 5.5.33 started; log sequence number 4462198 140301 19:37:54 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306 140301 19:37:54 [Note] - '0.0.0.0' resolves to '0.0.0.0'; 140301 19:37:54 [Note] Server socket created on IP: '0.0.0.0'. 140301 19:37:54 [ERROR] /Applications/MAMP/Library/bin/mysqld: Can't find file: './mysql/host.frm' (errno: 13) 140301 19:37:54 [ERROR] Fatal error: Can't open and lock privilege tables: Can't find file: './mysql/host.frm' (errno: 13) 140301 19:37:54 mysqld_safe mysqld from pid file /Applications/MAMP/tmp/mysql/mysql.pid ended ========== ターミナルで killall -9 mysqld も試しましたが、ダメでした…

    • ベストアンサー
    • Mac
  • phpMyadminでどうしてもinnoDBが有効になりません。

    phpMyadminでどうしてもinnoDBが有効になりません。 ローカル環境 phpMyAdmin - 2.11.4 MySQL クライアントのバージョン: 5.0.51a ストレートエンジンをMyISAMで開発を行っていましたが、 innoDBに変更することにしました。 色んなサイトを拝見しましたが、どうも有効になってくれません。 対処した項目を書きます。 (1) my.cnf内のskip-innodbをコメントアウト (2) 数回XAMPPのコントロールパネルからMySQLを再起動 (3) ログファイルib_logfileの確認 <無し>   (ログファイルが生まれていれば、xampp/mysql/data/ ← この中に生まれますよね?) (4) (3)のログファイルがあれば、それを削除しようと思いましたが見つかりませんので、   無視しました。このログファイルは、my.cnf内のinnodb_log_file_size = デフォルト値を   変更した場合、既に生まれているログファイルのサイズと異なっていらば、エラーとなるらしく、   まあ、一度もinnoDBにてテーブルを作成していないので、ログが生まれるはずもなく・・・    一応ケアーしてみました。 いかがでしょうか? これら以外に、innoDBがphpMyadminで有効になってくれない理由がありますでしょうか? かなりハマッてます・・・。お助け下さい。。

    • ベストアンサー
    • MySQL
  • MySQLが起動できない

    さくらのVPSを借りて構築を行っています。 基本的にMySQLだけを導入して運営させていてしばらく問題もなかったのですが、 最近、Perlなどを導入して権限周りに色々悩まされていました。 で、何が原因かはわかっていないのですが、MySQLが起動できなくなりました。 /etc/rc.d/init.d/mysqld restart を行うと、停止は出来るのですが起動に失敗します。 /var/log/mysqld.log を見てみると、 InnoDB: The InnoDB memory heap is disabled InnoDB: Mutexes and rw_locks use GCC atomic builtins InnoDB: Compressed tables use zlib 1.2.3 InnoDB: Using Linux native AIO InnoDB: Initializing buffer pool, size = 128.0M InnoDB: Completed initialization of buffer pool InnoDB: highest supported file format is Barracuda. InnoDB: Waiting for the background threads to start InnoDB: 1.1.8 started; log sequence number 1595675 [ERROR] /usr/libexec/mysqld: Error writing file '/var/run/mysqld/mysqld.pid' (Errcode: 28) [ERROR] Can't start server: can't create PID file: No space left on device mysqld_safe Number of processes running now: 0 mysqld_safe mysqld restarted [Note] Plugin 'FEDERATED' is disabled. と書かれており、権限で起動が出来なくなってるのかと思い、 ls -ld /var/run/mysqld/ で調べてみると、 drwxr-xr-x 2 mysql mysql 4096 11月 1 23:52 /var/run/mysqld/ と、MySQLをインストールした時と同様に、ユーザーはmysqlのままでした。 一応、chown -R mysql:mysql /var/run/mysqld/ でもう一度設定しなおして再起動を試みましたが、起動のみやはり失敗して、同じエラーログとなっています。 Apacheの起動・停止は問題ありません。 OSはCentos5.7でApache2.2ですが、どうも権限周りの設定が良くわかっておりません。 どうにか再インストール無しでMySQLを起動させたいのですが、ご教示頂けますと幸いです。 宜しくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • MySQLのエラーで非常に困っています

    rootユーザーからログインし、操作をしますが mysqlの挙動がおかしいです。データベースの作成はできますが、消去の際にエラーが出ます。また、cms等をインストールする際もエラーが頻出します。 mysqlのアップデートもしましたが症状変わりません。 MAMPPではインストールできたので、設定がおかしい可能性が高いと予想しています。 正常にデータベースの作成、消去ができるようにするにはどのように対処すればよろしいでしょうか。 また、ローカルとリモートサーバの設定を比較するにはどうしたらよいでしょうか。 回答をよろしくお願いします。 環境 CentOS6.3 Server version: 5.6.22 MySQL Community Server (GPL) エラー一覧 データベースを消去する際 ERROR 1010 (HY000): Error dropping database (can't rmdir './bs', errno: 39) cmsをインストールする際 エラー: SQLSTATE[HY000]: General error: 1005 Can't create table 'bs.deleteme71431' (errno: -1) 別のcmsでは‥ An exception occurred while executing 'CREATE TABLE PermissionAccessWorkflows (paID INT UNSIGNED DEFAULT 0 NOT NULL, wfID INT UNSIGNED DEFAULT 0 NOT NULL, INDEX wfID (wfID), PRIMARY KEY(paID, wfID)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB': SQLSTATE[HY000]: General error: 1005 Can't create table 'cms_con573_2.PermissionAccessWorkflows' (errno: -1). 同じことを意味しているとは思いますが MySQLエラーログ InnoDB: The file already exists though the corresponding table did not InnoDB: exist in the InnoDB data dictionary. Have you moved InnoDB InnoDB: .ibd files around without using the SQL commands InnoDB: DISCARD TABLESPACE and IMPORT TABLESPACE, or did InnoDB: mysqld crash in the middle of CREATE TABLE? You can InnoDB: resolve the problem by removing the file './cms_con573/PermissionAccessWorkflows.ibd' InnoDB: under the 'datadir' of MySQL. InnoDB: Unable to lock ./cms_con573_2/PermissionAccessWorkflows.ibd, error: 37 141228 2:15:12 InnoDB: Error creating file './cms_con573_2/PermissionAccessWorkflows.ibd'. 141228 2:15:12 InnoDB: Operating system error number 37 in a file operation. InnoDB: Error number 37 means 'No locks available'. InnoDB: Some operating system error numbers are described at InnoDB: ttp://dev.mysql.com/doc/refman/5.5/en/operating-system-error-codes.html

  • MySQLが起動しない

    このテーマの質問はいくつもあるのですが、解決に結びつくものがなく困っています。 もともと正常に動いていたのですが、再インストールしたところ起動しなくなりました。 再インストールは「yum -y install mysql-server」で行いました。 いろいろと試してはいるのですがうまくいきません。 どなたかお分かりの方がいらっしゃいましたら、ご教授いただけますでしょうか。 よろしくお願いします。 --------------------------  エラーログ -------------------------- 110709 16:46:38 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql 110709 16:46:38 [Note] Plugin 'InnoDB' is disabled. 110709 16:46:38 [Note] Plugin 'FEDERATED' is disabled. 110709 16:46:38 [ERROR] Unknown/unsupported storage engine: InnoDB 110709 16:46:38 [ERROR] Aborting 110709 16:46:38 [Note] /usr/libexec/mysqld: Shutdown complete 110709 16:46:38 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended --------------------------  my.cnf -------------------------- [mysqld] skip-innodb max_connections=30 datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock bind-address=127.0.0.1 # Default to using old password format for compatibility with mysql 3.x # clients (those using the mysqlclient10 compatibility package). old_passwords=1 [mysql.server] user=mysql sort_buffer=512 net_buffer_length=8 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid --------------------------  php.ini (一部抜粋) -------------------------- mysql.default_socket = mysql.default_host = mysql.default_user = mysqli.default_port = 3306 --------------------------  サーバー環境 -------------------------- OS: Red Hat Enterprise Linux ES release 4 MySQL: MySQL: 5.5.9-2 [ファイル構成] /var/run/mysqld/mysqld.pid /var/lib/mysql/mysql.sock ※上記のファイルは所定のディレクトリだけでなく、サーバー上に存在しません。 /var/lib/mysql  -mysql/  -performance_schema/  -test/

  • Innodbデータ拡大方法を教えてください。

    こんにちは。。 教えてください。 現在Mysql 5.0.45を利用してInnodbを使っています。 初めて、MysqlのInnodbを運用しておりますが データ容量が設計以上膨らんで 下記のようになってしまいました。 ------------------------------ #ls -al ibdata1 -rw-rw---- 1 mysql mysql 31182553088 5月 1 19:51 ibdata1 # du -sh ibdata1 30G ibdata1 ------------------------------ 問題は現在、サーバー上のハードディスク容量が少ないことで、 半年以内にハードディスクがFullになってしまう恐れがあります。 それでibdata1(innodb)から分離して、新しいストレージにibdata2(innodb)拡張を検証しました。 my.cnf innodb設定部分を(defalut) innodb_data_file_path = ibdata1:10M:autoextend ↓↓ innodb_data_file_path = ibdata1:32G;/ストレージサーバ/ibdata2:50G;/ストレージサーバ/ibdata3:10M:autoextend 上記のように検証しましたが、運用上では、無理でした。 いろいろ、やって見ましたが、失敗の連続。。。 Mysqlサイトではデータをバックアップ後に再構築方法しかないと書いておりますが、 http://dev.mysql.com/doc/refman/5.1/ja/adding-and-removing.html しかしながら、現在Innodbデータが30GぐらいでバックアップとImportするには相当時間が掛かってしまい、事実上で無理ですが、、 こんな時にはどうすれば宜しいですか。。 皆さん、教えて下さい。一週間ぐらい悩んでいます。。宜しいお願いします。

  • スレッドのロックに関するアルゴリズム

    今、プロセッサの並列処理に関する英文を読んでいるのですが、歯が立たなくて困っております。どなたか、知恵をお貸しください。 並列処理で発生する競合を検出するアルゴリズムの動作を示している箇所で、次の英文が出てきました。このアルゴリズムは、共通のロックを保持していない複数のスレッドが、共有サービス(メモリ?)にアクセスした場合に発生することのある競合をみつけるアルゴリズム、とのことです。 Set S(v) = S(v) intersection locks(th). If S(v) == NULL set, then raise an error. vは共有メモリ変数、C(v)は空でないロックのセット、locks(th)はすべてのロックを表すようです。 2つめの文章は、S(v)がNULLのときはエラーが発生、という意味だと思うのですが、1つめの文章の意味がよくわかりません。 intersectionとは論理積のことでしょうか? どなたか、知恵を貸してください!