国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 課堂 > 基礎(chǔ)知識(shí) > 正文

Innodb undo之 undo物理構(gòu)架的初始化

2024-09-12 20:29:59
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
  水平有限,如果有誤請(qǐng)指出。
  一直以來(lái)未對(duì)Innodb 的undo進(jìn)行好好的學(xué)習(xí),最近剛好有點(diǎn)時(shí)間準(zhǔn)備學(xué)習(xí)一下,通過(guò)阿里內(nèi)核月報(bào)和自己看代碼的綜合總結(jié)一下。本文環(huán)境:
 
  代碼版本 percona 5.7.22
  參數(shù) innodb_undo_tablespaces = 4 及使用了4個(gè)undo tablespace
  參數(shù) innodb_rollback_segments = 128
  本文描述使用如上參數(shù)的設(shè)置。
 
  一、undo 表空間物理文件的建立
  本過(guò)程調(diào)用函數(shù)srv_undo_tablespaces_init進(jìn)行,棧幀如下:
 
  #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
  本過(guò)程主要有如下幾個(gè)步驟:
 
  根據(jù)參數(shù)innodb_undo_tablespaces 的配置通過(guò)調(diào)用srv_undo_tablespace_create分別進(jìn)行文件建立,默認(rèn)建立的大小為10M:
  for (i = 0; create_new_db && i < n_conf_tablespaces; ++i) //n_conf_tablespaces 為innodb_undo_tablespaces的配置的個(gè)數(shù)/** 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文件...
  
  分別對(duì)4個(gè)undo tablespace調(diào)用srv_undo_tablespace_open 其主要調(diào)用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...
  }
  分別對(duì)4個(gè)undo tablespace 進(jìn)行fsp header初始化
  for (i = 0; i < n_undo_tablespaces; ++i) {
              fsp_header_init( //初始化fsp header 明顯 space id 已經(jīng)寫入
                  undo_tablespace_ids[i],
                  SRV_UNDO_TABLESPACE_SIZE_IN_PAGES, &mtr); //SRV_UNDO_TABLESPACE_SIZE_IN_PAGES 默認(rèn)的undo大小 10MB
 
  做完這個(gè)步驟只是生成了4個(gè)大小為10MB的 undo tablespace文件,并且已經(jīng)加入到Innodb文件體系,但是里面沒(méi)有任何類容。
 
  二、ibdata中system segment header的初始化
  本步驟調(diào)用 trx_sys_create_sys_pages->trx_sysf_create進(jìn)行,本步驟除了初始化transaction system segment以外還會(huì)初始化其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); //獲取內(nèi)存位置
      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個(gè)
      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); //將剩下的空間設(shè)置為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); //將第一個(gè)slot固定在ibdata中
  完成了這一步過(guò)后ibdata的 block 5 就初始化完了,而且我們看到所有的rollback segment slots 都初始化完成(源碼所示有256個(gè),實(shí)際上最多只會(huì)有128個(gè),其中0號(hào)solt固定在ibdata中),注意這里的槽大小是TRX_SYS_RSEG_SLOT_SIZE設(shè)置的大小為8字節(jié),4字節(jié)space id ,4字節(jié) page no,它們會(huì)指向 rollback segment header所在的位置。
 
  三、進(jìn)行rollback segment header的初始化
  調(diào)用 trx_sys_create_rsegs進(jìn)行:
 
  說(shuō)明一下關(guān)于innodb_undo_logs參數(shù)和innodb_rollback_segments參數(shù),他們作用就是設(shè)置rollback segment 的個(gè)數(shù),本文以128為例。
  根據(jù)注釋和代碼innodb_undo_logs已經(jīng)是個(gè)淘汰的參數(shù),應(yīng)該用innodb_rollback_segments代替。
  這兩個(gè)參數(shù)默認(rèn)是就是TRX_SYS_N_RSEGS及 128 其實(shí)不用設(shè)置的。本文也用128進(jìn)行討論。

(編輯:武林網(wǎng))

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 翼城县| 镇坪县| 忻城县| 南靖县| 万年县| 贵港市| 江口县| 广灵县| 墨江| 青铜峡市| 东方市| 含山县| 柏乡县| 嘉祥县| 宁夏| 巴林右旗| 玛曲县| 昌图县| 鞍山市| 玉山县| 策勒县| 西青区| 绥化市| 高雄市| 团风县| 策勒县| 鄂伦春自治旗| 荣昌县| 淅川县| 隆林| 前郭尔| 宁波市| 石屏县| 襄樊市| 临沭县| 祥云县| 永吉县| 红桥区| 乐东| 吴桥县| 永康市|