dict0boot.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:10k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Data dictionary creation and booting
  3. (c) 1996 Innobase Oy
  4. Created 4/18/1996 Heikki Tuuri
  5. *******************************************************/
  6. #include "dict0boot.h"
  7. #ifdef UNIV_NONINL
  8. #include "dict0boot.ic"
  9. #endif
  10. #include "dict0crea.h"
  11. #include "btr0btr.h"
  12. #include "dict0load.h"
  13. #include "dict0load.h"
  14. #include "trx0trx.h"
  15. #include "srv0srv.h"
  16. #include "ibuf0ibuf.h"
  17. #include "buf0flu.h"
  18. #include "log0recv.h"
  19. #include "os0file.h"
  20. /**************************************************************************
  21. Writes the current value of the row id counter to the dictionary header file
  22. page. */
  23. void
  24. dict_hdr_flush_row_id(void)
  25. /*=======================*/
  26. {
  27. dict_hdr_t* dict_hdr;
  28. dulint id;
  29. mtr_t mtr;
  30. ut_ad(mutex_own(&(dict_sys->mutex)));
  31. id = dict_sys->row_id;
  32. mtr_start(&mtr);
  33. dict_hdr = dict_hdr_get(&mtr);
  34. mlog_write_dulint(dict_hdr + DICT_HDR_ROW_ID, id, MLOG_8BYTES, &mtr); 
  35. mtr_commit(&mtr);
  36. }
  37. /*********************************************************************
  38. Creates the file page for the dictionary header. This function is
  39. called only at the database creation. */
  40. static
  41. ibool
  42. dict_hdr_create(
  43. /*============*/
  44. /* out: TRUE if succeed */
  45. mtr_t* mtr) /* in: mtr */
  46. {
  47. dict_hdr_t* dict_header;
  48. ulint hdr_page_no;
  49. ulint root_page_no;
  50. page_t* page;
  51. ut_ad(mtr);
  52. /* Create the dictionary header file block in a new, allocated file
  53. segment in the system tablespace */
  54. page = fseg_create(DICT_HDR_SPACE, 0,
  55.   DICT_HDR + DICT_HDR_FSEG_HEADER, mtr);
  56. hdr_page_no = buf_frame_get_page_no(page);
  57. ut_a(DICT_HDR_PAGE_NO == hdr_page_no);
  58. dict_header = dict_hdr_get(mtr);
  59. /* Start counting row, table, index, and tree ids from
  60. DICT_HDR_FIRST_ID */
  61. mlog_write_dulint(dict_header + DICT_HDR_ROW_ID,
  62. ut_dulint_create(0, DICT_HDR_FIRST_ID),
  63. MLOG_8BYTES, mtr);
  64. mlog_write_dulint(dict_header + DICT_HDR_TABLE_ID,
  65. ut_dulint_create(0, DICT_HDR_FIRST_ID),
  66. MLOG_8BYTES, mtr);
  67. mlog_write_dulint(dict_header + DICT_HDR_INDEX_ID,
  68. ut_dulint_create(0, DICT_HDR_FIRST_ID),
  69. MLOG_8BYTES, mtr);
  70. mlog_write_dulint(dict_header + DICT_HDR_MIX_ID,
  71. ut_dulint_create(0, DICT_HDR_FIRST_ID),
  72. MLOG_8BYTES, mtr);
  73. /* Create the B-tree roots for the clustered indexes of the basic
  74. system tables */
  75. /*--------------------------*/
  76. root_page_no = btr_create(DICT_CLUSTERED | DICT_UNIQUE,
  77. DICT_HDR_SPACE, DICT_TABLES_ID, mtr);
  78. if (root_page_no == FIL_NULL) {
  79. return(FALSE);
  80. }
  81. mlog_write_ulint(dict_header + DICT_HDR_TABLES, root_page_no,
  82. MLOG_4BYTES, mtr);
  83. /*--------------------------*/
  84. root_page_no = btr_create(DICT_UNIQUE, DICT_HDR_SPACE,
  85. DICT_TABLE_IDS_ID, mtr);
  86. if (root_page_no == FIL_NULL) {
  87. return(FALSE);
  88. }
  89. mlog_write_ulint(dict_header + DICT_HDR_TABLE_IDS, root_page_no,
  90. MLOG_4BYTES, mtr);
  91. /*--------------------------*/
  92. root_page_no = btr_create(DICT_CLUSTERED | DICT_UNIQUE,
  93. DICT_HDR_SPACE, DICT_COLUMNS_ID, mtr);
  94. if (root_page_no == FIL_NULL) {
  95. return(FALSE);
  96. }
  97. mlog_write_ulint(dict_header + DICT_HDR_COLUMNS, root_page_no,
  98. MLOG_4BYTES, mtr);
  99. /*--------------------------*/
  100. root_page_no = btr_create(DICT_CLUSTERED | DICT_UNIQUE,
  101. DICT_HDR_SPACE, DICT_INDEXES_ID, mtr);
  102. if (root_page_no == FIL_NULL) {
  103. return(FALSE);
  104. }
  105. mlog_write_ulint(dict_header + DICT_HDR_INDEXES, root_page_no,
  106. MLOG_4BYTES, mtr);
  107. /*--------------------------*/
  108. root_page_no = btr_create(DICT_CLUSTERED | DICT_UNIQUE,
  109. DICT_HDR_SPACE, DICT_FIELDS_ID, mtr);
  110. if (root_page_no == FIL_NULL) {
  111. return(FALSE);
  112. }
  113. mlog_write_ulint(dict_header + DICT_HDR_FIELDS, root_page_no,
  114. MLOG_4BYTES, mtr);
  115. /*--------------------------*/
  116. return(TRUE);
  117. }
  118. /*********************************************************************
  119. Initializes the data dictionary memory structures when the database is
  120. started. This function is also called when the data dictionary is created. */
  121. void
  122. dict_boot(void)
  123. /*===========*/
  124. {
  125. dict_table_t* table;
  126. dict_index_t* index;
  127. dict_hdr_t* dict_hdr;
  128. mtr_t mtr;
  129. mtr_start(&mtr);
  130. /* Create the hash tables etc. */
  131. dict_init();
  132. mutex_enter(&(dict_sys->mutex));
  133. /* Get the dictionary header */
  134. dict_hdr = dict_hdr_get(&mtr);
  135. /* Because we only write new row ids to disk-based data structure
  136. (dictionary header) when it is divisible by
  137. DICT_HDR_ROW_ID_WRITE_MARGIN, in recovery we will not recover
  138. the latest value of the row id counter. Therefore we advance
  139. the counter at the database startup to avoid overlapping values.
  140. Note that when a user after database startup first time asks for
  141. a new row id, then because the counter is now divisible by
  142. ..._MARGIN, it will immediately be updated to the disk-based
  143. header. */
  144. dict_sys->row_id = ut_dulint_add(
  145.      ut_dulint_align_up(
  146. mtr_read_dulint(dict_hdr + DICT_HDR_ROW_ID,
  147. MLOG_8BYTES, &mtr),
  148. DICT_HDR_ROW_ID_WRITE_MARGIN),
  149.      DICT_HDR_ROW_ID_WRITE_MARGIN);
  150. /* Insert into the dictionary cache the descriptions of the basic
  151. system tables */
  152. /*-------------------------*/
  153. table = dict_mem_table_create("SYS_TABLES", DICT_HDR_SPACE, 8);
  154. dict_mem_table_add_col(table, "NAME", DATA_BINARY, 0, 0, 0);
  155. dict_mem_table_add_col(table, "ID", DATA_BINARY, 0, 0, 0);
  156. dict_mem_table_add_col(table, "N_COLS", DATA_INT, 0, 4, 0);
  157. dict_mem_table_add_col(table, "TYPE", DATA_INT, 0, 4, 0);
  158. dict_mem_table_add_col(table, "MIX_ID", DATA_BINARY, 0, 0, 0);
  159. dict_mem_table_add_col(table, "MIX_LEN", DATA_INT, 0, 4, 0);
  160. dict_mem_table_add_col(table, "CLUSTER_NAME", DATA_BINARY, 0, 0, 0);
  161. dict_mem_table_add_col(table, "SPACE", DATA_INT, 0, 4, 0);
  162. table->id = DICT_TABLES_ID;
  163. dict_table_add_to_cache(table);
  164. dict_sys->sys_tables = table;
  165. index = dict_mem_index_create("SYS_TABLES", "CLUST_IND",
  166. DICT_HDR_SPACE,
  167.    DICT_UNIQUE | DICT_CLUSTERED, 1);
  168. dict_mem_index_add_field(index, "NAME", 0);
  169. index->page_no = mtr_read_ulint(dict_hdr + DICT_HDR_TABLES,
  170. MLOG_4BYTES, &mtr);
  171. index->id = DICT_TABLES_ID;
  172. ut_a(dict_index_add_to_cache(table, index));
  173. /*-------------------------*/
  174. index = dict_mem_index_create("SYS_TABLES", "ID_IND", DICT_HDR_SPACE,
  175. DICT_UNIQUE, 1);
  176. dict_mem_index_add_field(index, "ID", 0);
  177. index->page_no = mtr_read_ulint(dict_hdr + DICT_HDR_TABLE_IDS,
  178. MLOG_4BYTES, &mtr);
  179. index->id = DICT_TABLE_IDS_ID;
  180. ut_a(dict_index_add_to_cache(table, index));
  181. /*-------------------------*/
  182. table = dict_mem_table_create("SYS_COLUMNS", DICT_HDR_SPACE, 7);
  183. dict_mem_table_add_col(table, "TABLE_ID", DATA_BINARY, 0, 0, 0);
  184. dict_mem_table_add_col(table, "POS", DATA_INT, 0, 4, 0);
  185. dict_mem_table_add_col(table, "NAME", DATA_BINARY, 0, 0, 0);
  186. dict_mem_table_add_col(table, "MTYPE", DATA_INT, 0, 4, 0);
  187. dict_mem_table_add_col(table, "PRTYPE", DATA_INT, 0, 4, 0);
  188. dict_mem_table_add_col(table, "LEN", DATA_INT, 0, 4, 0);
  189. dict_mem_table_add_col(table, "PREC", DATA_INT, 0, 4, 0);
  190. table->id = DICT_COLUMNS_ID;
  191. dict_table_add_to_cache(table);
  192. dict_sys->sys_columns = table;
  193. index = dict_mem_index_create("SYS_COLUMNS", "CLUST_IND",
  194. DICT_HDR_SPACE,
  195.    DICT_UNIQUE | DICT_CLUSTERED, 2);
  196. dict_mem_index_add_field(index, "TABLE_ID", 0);
  197. dict_mem_index_add_field(index, "POS", 0);
  198. index->page_no = mtr_read_ulint(dict_hdr + DICT_HDR_COLUMNS,
  199. MLOG_4BYTES, &mtr);
  200. index->id = DICT_COLUMNS_ID;
  201. ut_a(dict_index_add_to_cache(table, index));
  202. /*-------------------------*/
  203. table = dict_mem_table_create("SYS_INDEXES", DICT_HDR_SPACE, 7);
  204. dict_mem_table_add_col(table, "TABLE_ID", DATA_BINARY, 0, 0, 0);
  205. dict_mem_table_add_col(table, "ID", DATA_BINARY, 0, 0, 0);
  206. dict_mem_table_add_col(table, "NAME", DATA_BINARY, 0, 0, 0);
  207. dict_mem_table_add_col(table, "N_FIELDS", DATA_INT, 0, 4, 0);
  208. dict_mem_table_add_col(table, "TYPE", DATA_INT, 0, 4, 0);
  209. dict_mem_table_add_col(table, "SPACE", DATA_INT, 0, 4, 0);
  210. dict_mem_table_add_col(table, "PAGE_NO", DATA_INT, 0, 4, 0);
  211. /* The '+ 2' below comes from the 2 system fields */
  212. ut_ad(DICT_SYS_INDEXES_PAGE_NO_FIELD == 6 + 2);
  213. ut_ad(DICT_SYS_INDEXES_SPACE_NO_FIELD == 5 + 2); 
  214. table->id = DICT_INDEXES_ID;
  215. dict_table_add_to_cache(table);
  216. dict_sys->sys_indexes = table;
  217. index = dict_mem_index_create("SYS_INDEXES", "CLUST_IND",
  218. DICT_HDR_SPACE,
  219. DICT_UNIQUE | DICT_CLUSTERED, 2);
  220. dict_mem_index_add_field(index, "TABLE_ID", 0);
  221. dict_mem_index_add_field(index, "ID", 0);
  222. index->page_no = mtr_read_ulint(dict_hdr + DICT_HDR_INDEXES,
  223. MLOG_4BYTES, &mtr);
  224. index->id = DICT_INDEXES_ID;
  225. ut_a(dict_index_add_to_cache(table, index));
  226. /*-------------------------*/
  227. table = dict_mem_table_create("SYS_FIELDS", DICT_HDR_SPACE, 3);
  228. dict_mem_table_add_col(table, "INDEX_ID", DATA_BINARY, 0, 0, 0);
  229. dict_mem_table_add_col(table, "POS", DATA_INT, 0, 4, 0);
  230. dict_mem_table_add_col(table, "COL_NAME", DATA_BINARY, 0, 0, 0);
  231. table->id = DICT_FIELDS_ID;
  232. dict_table_add_to_cache(table);
  233. dict_sys->sys_fields = table;
  234. index = dict_mem_index_create("SYS_FIELDS", "CLUST_IND",
  235. DICT_HDR_SPACE,
  236. DICT_UNIQUE | DICT_CLUSTERED, 2);
  237. dict_mem_index_add_field(index, "INDEX_ID", 0);
  238. dict_mem_index_add_field(index, "POS", 0);
  239. index->page_no = mtr_read_ulint(dict_hdr + DICT_HDR_FIELDS,
  240. MLOG_4BYTES, &mtr);
  241. index->id = DICT_FIELDS_ID;
  242. ut_a(dict_index_add_to_cache(table, index));
  243. mtr_commit(&mtr);
  244. /*-------------------------*/
  245. /* Load definitions of other indexes on system tables */
  246. dict_load_sys_table(dict_sys->sys_tables);
  247. dict_load_sys_table(dict_sys->sys_columns);
  248. dict_load_sys_table(dict_sys->sys_indexes);
  249. dict_load_sys_table(dict_sys->sys_fields);
  250. /* Initialize the insert buffer table and index for each tablespace */
  251. ibuf_init_at_db_start();
  252. mutex_exit(&(dict_sys->mutex));
  253. }
  254. /*********************************************************************
  255. Inserts the basic system table data into themselves in the database
  256. creation. */
  257. static
  258. void
  259. dict_insert_initial_data(void)
  260. /*==========================*/
  261. {
  262. /* Does nothing yet */
  263. }
  264. /*********************************************************************
  265. Creates and initializes the data dictionary at the database creation. */
  266. void
  267. dict_create(void)
  268. /*=============*/
  269. {
  270. mtr_t mtr;
  271. mtr_start(&mtr);
  272. dict_hdr_create(&mtr);
  273. mtr_commit(&mtr);
  274. dict_boot();
  275. dict_insert_initial_data();
  276. sync_order_checks_on = TRUE;
  277. }