<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## 背景 我們知道當一張表的某個字段存在重復值時,這個字段沒辦法直接加UNIQUE KEY,但是MySQL提供了一個 ALTER IGNORE TABLE的方式,可以忽略修改表結構過程中出現的錯誤,但是要忽略UNIQUE重復值,就需要打開old_alter_table,也就是拷貝表的方式來ALTER TABLE。 例如這樣: ~~~ CREATE TABLE t1(c1 int) ENGINE = InnoDB; INSERT INTO t1 VALUES (1), (1); SET old_alter_table=1; ALTER IGNORE TABLE t1 ADD UNIQUE (c1); ~~~ 但是如果你是 MySQL 5.5 主備環境,你會發現備庫收到這個DDL后,SQL THREAD 會給你一個無情的報錯: ~~~ 'Error 'Duplicate entry '1' for key 'c1'' on query. Default database: 'test'. Query: 'ALTER IGNORE TABLE t1 ADD UNIQUE (c1)'' ~~~ ## 原因 這是為什么呢? 其實關鍵問題就是這個SQL要執行成功,必須保證 old_alter_table 打開,但是 MySQL 的 SET 語句并不參與復制,因此備庫只收到了一個 ALTER IGNORE TABLE,而沒有先打開 old_alter_table,因此備庫用的不是整表拷貝的方法來重建表,因而無法執行成功。 ## 解決 那我們怎么解決這個問題呢,也很簡單,只要備庫Slave線程也用 old_alter_table=1 來執行 ALTER IGNORE TABLE就好了。 本質上就是?`mysql_alter_table()`?中需要讓`need_copy_table= ALTER_TABLE_DATA_CHANGED`(old_alter_table=1),而不是`need_copy_table= ALTER_TABLE_INDEX_CHANGED`(old_alter_table=0)。 因此我們只要在`mysql_alter_table()`函數中判斷該用哪種算法的時候,給出一個可以干預的變量,讓Slave線程在需要的時候可以按`need_copy_table= ALTER_TABLE_DATA_CHANGED`執行。 原來的代碼: ~~~ if ((thd->variables.old_alter_table || (table->s->db_type() != create_info->db_type) #ifdef WITH_PARTITION_STORAGE_ENGINE || partition_changed #endif ) need_copy_table= ALTER_TABLE_DATA_CHANGED; ~~~ 我們加上判斷 (‘是否啟用Slave自動用 ALTER_TABLE_DATA_CHANGED 方式做ALTER IGNORE TABLE’ &&?`thd->slave_thread`?&& ignore),就可以在我們打開控制變量的時候,強制讓Slave線程用 old_alter_table=1 的方式來執行 ALTER IGNORE TABLE。 ~~~ if ((thd->variables.old_alter_table || ('是否啟用Slave自動用 ALTER_TABLE_DATA_CHANGED 方式做ALTER IGNORE TABLE' && thd->slave_thread && ignore)) || (table->s->db_type() != create_info->db_type) #ifdef WITH_PARTITION_STORAGE_ENGINE || partition_changed #endif ) need_copy_table= ALTER_TABLE_DATA_CHANGED; ~~~
                  <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>

                              哎呀哎呀视频在线观看