<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## 問題描述 主庫的`create table`語句傳到備庫,備庫SQL線程執行過程中報錯: ~~~ Error 'Can't create table 'XXX.XX' (errno: -1)' on query. Default database: 'XXX'. Query: 'CREATE TABLE XX ( column_a char(32) NOT NULL, column_b int(10) DEFAULT NULL, column_c int(10) DEFAULT NULL, PRIMARY KEY (column_a), KEY expiry (column_b)) ENGINE=HEAP DEFAULT CHARSET=gbk' ~~~ 備庫 error log: ~~~ InnoDB: Error number 17 means 'File exists'. InnoDB: Some operating system error numbers are described at InnoDB: http://dev.mysql.com/doc/refman/5.5/en/operating-system-error- codes.html 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 '...' InnoDB: under the 'datadir' of MySQL. ~~~ 從error log中可以看出,數據目錄中已存在 .ibd 文件,推測是在建表過程中發生 crash。 數據目錄下存在 .ibd,不存在 .frm,創建.ibd 文件的時間: ~~~ -rw-rw---- 1 mysql mysql 65536 Sep 5 14:41 XXX.ibd ~~~ .ibd 文件創建時間 150905 14:41,對應時間的 error log: ~~~ 150905 14:41:58 mysqld_safe Number of processes running now: 0 150905 14:41:58 mysqld_safe mysqld restarted ~~~ 之后也出現了和該創建失敗的表相關的錯誤記錄: ~~~ 150905 14:59:45 InnoDB: Error: table `XXX`.`XX` does not exist in the InnoDB internal ~~~ ## 問題分析 執行如下語句,模擬建表 ~~~ create table test.t3 (id int); ~~~ `create table`?時,由函數`mysql_create_frm`創建 .frm 文件,`mysql_create_frm`?調用棧如下: ~~~ #0 mysql_create_frm #1 rea_create_table #2 mysql_create_table_no_lock #3 mysql_create_table #4 mysql_execute_command #5 mysql_parse ~~~ t3.frm 文件生成后,實例 crash(函數`mysql_create_frm`?執行完畢后`kill mysqld`),在數據庫中`show tables`可以看到 test.t3,但是無法插入,數據目錄下 t3.frm 文件依然存在。 `drop table`報錯 ~~~ ERROR 1051 (42S02): Unknown table 'test.t3' ~~~ 之后數據目錄下的t3.frm不存在,show tables 無法看到t3表,可以重新創建t3表。 .ibd 文件由函數`fil_create_new_single_table_tablespace`創建,`fil_create_new_single_table_tablespace`調用棧如下: ~~~ #0 fil_create_new_single_table_tablespace #1 dict_build_table_def_step #2 dict_create_table_step #3 que_thr_step #4 que_run_threads_low #5 que_run_threads #6 row_create_table_for_mysql #7 create_table_def #8 ha_innobase::create #9 handler::ha_create #10 ha_create_table #11 rea_create_table #12 create_table_impl #13 mysql_create_table_no_lock #14 mysql_create_table #15 mysql_execute_command #16 mysql_parse ~~~ t3.ibd 文件生成后,實例 crash(函數`fil_create_new_single_table_tablespace`執行完畢后`kill mysqld`),在數據庫中`show tables`可以看到 test.t3,無法插入數據,在數據目錄下存在文件 t3.frm 和 t3.ibd。 `drop table`依然可以移除 t3.frm 并使`show tables`無法看到 t3 表。但無法移除 t3.ibd,并在重建 t3 表時報錯: ~~~ ERROR 1813 (HY000): Tablespace for table '`test`.`t3`' exists. Please DISCARD the tablespace before IMPORT. ~~~ 在數據目錄中刪除 t3.ibd ,可以正常重建 t3 表。 這個 bug 的主要原因是 MySQL 的建表過程不是原子操作。如果建表過程正在進行的時候實例 crash,可能會造成一些在實例重啟后無法自動恢復的問題。就像這個問題當中的文件殘留,無法通過 MySQL 客戶端中的操作解決,只能手動刪除文件。如果用戶是遠程連接數據庫,又沒有登錄服務器操作數據文件的權限,就會影響數據庫的可用性。 MySQL 5.7 的實驗室版本正在設計和實現新版本的數據字典來解決這一問題。這個版本主要由以下幾個特性: * 數據字典將實現事務存儲,首先利用 InnoDB 存儲,其他存儲引擎可能會跟進開發; * 把分布式系統中的字典信息統一成一個整體; * 使用統一的規則存儲字典信息,給字典對象定義統一的API; * 避免文件系統特性帶來的問題。 詳細信息參見[MySQL Server Blog](http://mysqlserverteam.com/a-new-data-dictionary-for-mysql/) ## 問題解決 通過問題分析,判斷備庫無法建表是由于在執行`create table`語句時備庫實例crash,且crash時.ibd 文件已存在。用戶發現表創建失敗,企圖重建表依然失敗,之后執行了`drop table`語句,移除了.frm文件,但.ibd文件依然存在,無法重建表。 將數據目錄下的.ibd文件移到其他文件夾作為備份,在備庫`start slave`后建表成功,主備復制正常。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看