麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 課堂 > 基礎知識 > 正文

Innodb undo之 undo物理構架的初始化

2024-09-12 20:29:59
字體:
來源:轉載
供稿:網友
  水平有限,如果有誤請指出。
  一直以來未對Innodb 的undo進行好好的學習,最近剛好有點時間準備學習一下,通過阿里內核月報和自己看代碼的綜合總結一下。本文環境:
 
  代碼版本 percona 5.7.22
  參數 innodb_undo_tablespaces = 4 及使用了4個undo tablespace
  參數 innodb_rollback_segments = 128
  本文描述使用如上參數的設置。
 
  一、undo 表空間物理文件的建立
  本過程調用函數srv_undo_tablespaces_init進行,棧幀如下:
 
  #0  srv_undo_tablespaces_init (create_new_db=true, n_conf_tablespaces=4, n_opened=0x2ef55b0)
      at /root/mysqlc/percona-server-locks-detail-5.7.22/storage/innobase/srv/srv0start.cc:824#1  0x0000000001bbd7e0 in innobase_start_or_create_for_mysql () at /root/mysqlc/percona-server-locks-detail-5.7.22/storage/innobase/srv/srv0start.cc:2188#2  0x00000000019ca74e in innobase_init (p=0x2f2a420) at /root/mysqlc/percona-server-locks-detail-5.7.22/storage/innobase/handler/ha_innodb.cc:4409#3  0x0000000000f7ec2a in ha_initialize_handlerton (plugin=0x2fca110) at /root/mysqlc/percona-server-locks-detail-5.7.22/sql/handler.cc:871#4  0x00000000015f9edf in plugin_initialize (plugin=0x2fca110) at /root/mysqlc/percona-server-locks-detail-5.7.22/sql/sql_plugin.cc:1252
  本過程主要有如下幾個步驟:
 
  根據參數innodb_undo_tablespaces 的配置通過調用srv_undo_tablespace_create分別進行文件建立,默認建立的大小為10M:
  for (i = 0; create_new_db && i < n_conf_tablespaces; ++i) //n_conf_tablespaces 為innodb_undo_tablespaces的配置的個數/** Default undo tablespace size in UNIV_PAGEs count (10MB). */const ulint SRV_UNDO_TABLESPACE_SIZE_IN_PAGES =
      ((1024 * 1024) * 10) / UNIV_PAGE_SIZE_DEF;
  ...
          err = srv_undo_tablespace_create(
              name, SRV_UNDO_TABLESPACE_SIZE_IN_PAGES); //建立undo文件...
  
  分別對4個undo tablespace調用srv_undo_tablespace_open 其主要調用fil_space_create 和 fil_node_create將新建立的undo tablespace加入Innodb的文件體系。
  for (i = 0; i < n_undo_tablespaces; ++i) {
  ....
  err = srv_undo_tablespace_open(name, undo_tablespace_ids[i]); //打開UNDO文件 建立 file node...
  }
  分別對4個undo tablespace 進行fsp header初始化
  for (i = 0; i < n_undo_tablespaces; ++i) {
              fsp_header_init( //初始化fsp header 明顯 space id 已經寫入
                  undo_tablespace_ids[i],
                  SRV_UNDO_TABLESPACE_SIZE_IN_PAGES, &mtr); //SRV_UNDO_TABLESPACE_SIZE_IN_PAGES 默認的undo大小 10MB
 
  做完這個步驟只是生成了4個大小為10MB的 undo tablespace文件,并且已經加入到Innodb文件體系,但是里面沒有任何類容。
 
  二、ibdata中system segment header的初始化
  本步驟調用 trx_sys_create_sys_pages->trx_sysf_create進行,本步驟除了初始化transaction system segment以外還會初始化其header( ibdata page no 5))信息如下:
 
  /* Create the trx sys file block in a new allocated file segment */
      block = fseg_create(TRX_SYS_SPACE, 0, TRX_SYS + TRX_SYS_FSEG_HEADER,
                  mtr); //建立segment
      buf_block_dbg_add_level(block, SYNC_TRX_SYS_HEADER);
      ut_a(block->page.id.page_no() == TRX_SYS_PAGE_NO);
      page = buf_block_get_frame(block); //獲取內存位置
      mlog_write_ulint(page + FIL_PAGE_TYPE, FIL_PAGE_TYPE_TRX_SYS, //寫入block 的類型
               MLOG_2BYTES, mtr);
      ...    /* Start counting transaction ids from number 1 up */
      mach_write_to_8(sys_header + TRX_SYS_TRX_ID_STORE, 1); // 初始化TRX_SYS_TRX_ID_STORE
      /* Reset the rollback segment slots.  Old versions of InnoDB
      define TRX_SYS_N_RSEGS as 256 (TRX_SYS_OLD_N_RSEGS) and expect
      that the whole array is initialized. */
      ptr = TRX_SYS_RSEGS + sys_header;
      len = ut_max(TRX_SYS_OLD_N_RSEGS, TRX_SYS_N_RSEGS)
          * TRX_SYS_RSEG_SLOT_SIZE;//TRX_SYS_OLD_N_RSEGS 為256個
      memset(ptr, 0xff, len); //將slot的信息的全部初始化為ff
      ptr += len;
      ut_a(ptr <= page + (UNIV_PAGE_SIZE - FIL_PAGE_DATA_END));    /* Initialize all of the page.  This part used to be uninitialized. */
      memset(ptr, 0, UNIV_PAGE_SIZE - FIL_PAGE_DATA_END + page - ptr); //將剩下的空間設置為0x00
      mlog_log_string(sys_header, UNIV_PAGE_SIZE - FIL_PAGE_DATA_END
              + page - sys_header, mtr);    /* Create the first rollback segment in the SYSTEM tablespace */
      slot_no = trx_sysf_rseg_find_free(mtr, false, 0);
      page_no = trx_rseg_header_create(TRX_SYS_SPACE, univ_page_size,
                       ULINT_MAX, slot_no, mtr); //將第一個slot固定在ibdata中
  完成了這一步過后ibdata的 block 5 就初始化完了,而且我們看到所有的rollback segment slots 都初始化完成(源碼所示有256個,實際上最多只會有128個,其中0號solt固定在ibdata中),注意這里的槽大小是TRX_SYS_RSEG_SLOT_SIZE設置的大小為8字節,4字節space id ,4字節 page no,它們會指向 rollback segment header所在的位置。
 
  三、進行rollback segment header的初始化
  調用 trx_sys_create_rsegs進行:
 
  說明一下關于innodb_undo_logs參數和innodb_rollback_segments參數,他們作用就是設置rollback segment 的個數,本文以128為例。
  根據注釋和代碼innodb_undo_logs已經是個淘汰的參數,應該用innodb_rollback_segments代替。
  這兩個參數默認是就是TRX_SYS_N_RSEGS及 128 其實不用設置的。本文也用128進行討論。

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美黄色试片 | 日韩欧美动作影片 | 一本一道久久久a久久久精品91 | h色网站在线观看 | www69xxxxx| 国产羞羞视频在线观看 | 精品国产一区二区亚洲人成毛片 | 国产精品久久久久久久不卡 | 国产激情精品一区二区三区 | 亚洲综合视频网 | 久久久久北条麻妃免费看 | 日本免费一区二区三区四区 | 国产高清自拍一区 | 亚洲精品aa | 久久久久亚洲a | 成年性羞羞视频免费观看 | 激情综合网俺也去 | 国产在线1区 | 草草视频免费 | 美女视频在线观看黄 | 蜜桃av网| 男男啪羞羞视频网站 | 国内精品伊人久久 | 中文字幕电影免费播放 | 欧美2区| 91九色精品国产 | 黄视频在线网站 | av电影网站在线 | 国产成人高清在线观看 | 亚洲国产成人久久一区www妖精 | 久久精品综合视频 | 黄色av片三级三级三级免费看 | 午夜色视频在线观看 | 国内精品久久久久久久久久 | 午夜视 | 欧美巨根 | xxxxxx打针视频vk | 精品中文一区 | 中文字幕在线观看精品 | 日韩美香港a一级毛片免费 日韩激情 | 国产91影院 |