{"id":96,"date":"2018-09-18T04:14:21","date_gmt":"2018-09-18T04:14:21","guid":{"rendered":"http:\/\/oracle-internals.com\/blog\/?p=96"},"modified":"2018-09-18T20:28:45","modified_gmt":"2018-09-18T20:28:45","slug":"revisiting-embedded-innodb","status":"publish","type":"post","link":"http:\/\/oracle-internals.com\/blog\/2018\/09\/18\/revisiting-embedded-innodb\/","title":{"rendered":"Revisiting Embedded InnoDB"},"content":{"rendered":"<p>Many people these days don&#8217;t know <a href=\"https:\/\/en.wikipedia.org\/wiki\/InnoDB\" target=\"_blank\" rel=\"noopener\">InnoDB<\/a> was originally developed as an independent database engine apart from MySQL.\u00a0Its author, Heikki Tuuri, modeled InnoDB after\u00a0<a href=\"https:\/\/www.amazon.com\/Transaction-Processing-Concepts-Techniques-Management-ebook\/dp\/B016W7HLX8\" target=\"_blank\" rel=\"noopener\">Transaction Processing: Concepts and Techniques<\/a>, the seminal transaction processing book authored by <a href=\"https:\/\/en.wikipedia.org\/wiki\/Jim_Gray_(computer_scientist)\" target=\"_blank\" rel=\"noopener\">Turing Award laureate James &#8220;Jim&#8221; Gray<\/a> and <a href=\"https:\/\/en.wikipedia.org\/wiki\/Andreas_Reuter\" target=\"_blank\" rel=\"noopener\">Andreas Reuter<\/a>. It wasn&#8217;t until later InnoDB was integrated with MySQL.<\/p>\n<p>While InnoDB contains a very simple, barebones, <a href=\"https:\/\/github.com\/nextgres\/oss-embedded-innodb\/tree\/master\/pars\" target=\"_blank\" rel=\"noopener\">parser<\/a> and <a href=\"https:\/\/github.com\/nextgres\/oss-embedded-innodb\/tree\/master\/eval\" target=\"_blank\" rel=\"noopener\">executor<\/a>, it&#8217;s major advantage was in its solid transactional storage engine implementation. The advantage to using MySQL for the high-level database functionality was that a full SQL parser, optimizer, et al didn&#8217;t have to be developed and InnoDB could focus on its strengths; this was especially true when compared to the two other popular storage engines of the day,\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/MyISAM\" target=\"_blank\" rel=\"noopener\">MyISAM<\/a> and the <a href=\"https:\/\/docs.oracle.com\/cd\/E17952_01\/mysql-5.0-en\/bdb-storage-engine.html\" target=\"_blank\" rel=\"noopener\">Berkeley DB (BDB) Storage Engine<\/a>, which&#8211;when I met with\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Keith_Bostic\" target=\"_blank\" rel=\"noopener\">Keith Bostic<\/a> in 2005&#8211;it seemed <a href=\"https:\/\/en.wikipedia.org\/wiki\/Sleepycat_Software\" target=\"_blank\" rel=\"noopener\">Sleepycat<\/a> had no interest in pursuing. Several years later, after InnoDB was already considered the defacto production-ready storage engine for MySQL, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Innobase\" target=\"_blank\" rel=\"noopener\">Innobase Oy<\/a> released the <a href=\"https:\/\/web.archive.org\/web\/20100511004938\/http:\/\/www.innodb.com\/wp\/products\/embedded-innodb\/\" target=\"_blank\" rel=\"noopener\">Embedded InnoDB<\/a>, which enabled developers to embed the open-source InnoDB database engine directly within their applications. As I had done some work years before to extract the storage engine from MySQL and use it in my own project, Prophet, this was a pretty awesome turn of events. Sadly, however, it ended-up being overlooked and died pretty quickly.<\/p>\n<p>Given the death of the official Embedded InnoDB, developer\u00a0<a href=\"https:\/\/www.flamingspork.com\/\" target=\"_blank\" rel=\"noopener\">Stewart Smith<\/a> took up the reins, forked the codebase, and began a separate project he called <a href=\"https:\/\/web.archive.org\/web\/20130206133841\/http:\/\/haildb.com\/\" target=\"_blank\" rel=\"noopener\">HailDB<\/a>. This continued for some time and resulted in a couple releases. Eventually, however, the same disinterest Innobase saw resulted in the project being canned as well.<\/p>\n<p>For posterity, I&#8217;ve uploaded a copy of the original release of the official <a href=\"https:\/\/github.com\/nextgres\/oss-embedded-innodb\" target=\"_blank\" rel=\"noopener\">Embedded InnoDB source code<\/a>\u00a0as well as <a href=\"https:\/\/github.com\/nextgres\/oss-embedded-innodb-docs\" target=\"_blank\" rel=\"noopener\">the documentation not included in the source distribution<\/a>. Likewise, I&#8217;ve committed <a href=\"https:\/\/github.com\/nextgres\/oss-haildb\" target=\"_blank\" rel=\"noopener\">the code to the last official release of HailDB<\/a> along with <a href=\"https:\/\/github.com\/nextgres\/oss-haildb\/blob\/master\/sample\/simple.c\" target=\"_blank\" rel=\"noopener\">example code demonstrating how to develop against the embedded database engine<\/a>.<\/p>\n<p>You may ask, &#8220;what would it take to get the latest InnoDB working in embedded mode?&#8221; Well, I&#8217;ve done a cursory look and I believe it would take a week or so to re-work things from the current <a href=\"https:\/\/github.com\/mysql\/mysql-server\/tree\/8.0\/storage\/innobase\" target=\"_blank\" rel=\"noopener\">C++-based MySQL server codebase<\/a> and swap out the items required for it to be standalone again. While I have several cool uses for this, including my old <a href=\"https:\/\/github.com\/nextgres\/nextgres-btrvodbc\" target=\"_blank\" rel=\"noopener\">drop-in replacement libraries for Btrieve<\/a> and <a href=\"https:\/\/github.com\/nextgres\/nextgres-esent-lmdb\" target=\"_blank\" rel=\"noopener\">Microsoft Jet\/Extensible Storage Engine (ESENT)<\/a>, it&#8217;s not worth my free-time to work on.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Many people these days don&#8217;t know InnoDB was originally developed as an independent database engine apart from MySQL.\u00a0Its author, Heikki Tuuri, modeled InnoDB after\u00a0Transaction Processing: Concepts and Techniques, the seminal transaction processing book authored by Turing Award laureate James &#8220;Jim&#8221; Gray and Andreas Reuter. It wasn&#8217;t until later InnoDB was integrated with MySQL. While InnoDB [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,8],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Revisiting Embedded InnoDB - Oracle Internals<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/oracle-internals.com\/blog\/2018\/09\/18\/revisiting-embedded-innodb\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Revisiting Embedded InnoDB - Oracle Internals\" \/>\n<meta property=\"og:description\" content=\"Many people these days don&#8217;t know InnoDB was originally developed as an independent database engine apart from MySQL.\u00a0Its author, Heikki Tuuri, modeled InnoDB after\u00a0Transaction Processing: Concepts and Techniques, the seminal transaction processing book authored by Turing Award laureate James &#8220;Jim&#8221; Gray and Andreas Reuter. It wasn&#8217;t until later InnoDB was integrated with MySQL. While InnoDB [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oracle-internals.com\/blog\/2018\/09\/18\/revisiting-embedded-innodb\/\" \/>\n<meta property=\"og:site_name\" content=\"Oracle Internals\" \/>\n<meta property=\"article:published_time\" content=\"2018-09-18T04:14:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-09-18T20:28:45+00:00\" \/>\n<meta name=\"author\" content=\"Jonah Harris\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@jonahharris\" \/>\n<meta name=\"twitter:site\" content=\"@jonahharris\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jonah Harris\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/oracle-internals.com\/blog\/2018\/09\/18\/revisiting-embedded-innodb\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oracle-internals.com\/blog\/2018\/09\/18\/revisiting-embedded-innodb\/\"},\"author\":{\"name\":\"Jonah Harris\",\"@id\":\"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/549d9c522c3960b062618b600bb762a4\"},\"headline\":\"Revisiting Embedded InnoDB\",\"datePublished\":\"2018-09-18T04:14:21+00:00\",\"dateModified\":\"2018-09-18T20:28:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oracle-internals.com\/blog\/2018\/09\/18\/revisiting-embedded-innodb\/\"},\"wordCount\":425,\"publisher\":{\"@id\":\"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/549d9c522c3960b062618b600bb762a4\"},\"articleSection\":[\"Databases\",\"InnoDB\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oracle-internals.com\/blog\/2018\/09\/18\/revisiting-embedded-innodb\/\",\"url\":\"https:\/\/oracle-internals.com\/blog\/2018\/09\/18\/revisiting-embedded-innodb\/\",\"name\":\"Revisiting Embedded InnoDB - Oracle Internals\",\"isPartOf\":{\"@id\":\"http:\/\/oracle-internals.com\/blog\/#website\"},\"datePublished\":\"2018-09-18T04:14:21+00:00\",\"dateModified\":\"2018-09-18T20:28:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oracle-internals.com\/blog\/2018\/09\/18\/revisiting-embedded-innodb\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oracle-internals.com\/blog\/2018\/09\/18\/revisiting-embedded-innodb\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oracle-internals.com\/blog\/2018\/09\/18\/revisiting-embedded-innodb\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"http:\/\/oracle-internals.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Revisiting Embedded InnoDB\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/oracle-internals.com\/blog\/#website\",\"url\":\"http:\/\/oracle-internals.com\/blog\/\",\"name\":\"Oracle Internals\",\"description\":\"Researching the Inner Workings of the World&#039;s Most Powerful Database\",\"publisher\":{\"@id\":\"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/549d9c522c3960b062618b600bb762a4\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/oracle-internals.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/549d9c522c3960b062618b600bb762a4\",\"name\":\"Jonah Harris\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"http:\/\/1.gravatar.com\/avatar\/a6d16ed0f510e8de0929f129471dc1e5?s=96&d=mm&r=g\",\"contentUrl\":\"http:\/\/1.gravatar.com\/avatar\/a6d16ed0f510e8de0929f129471dc1e5?s=96&d=mm&r=g\",\"caption\":\"Jonah Harris\"},\"logo\":{\"@id\":\"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/jonahharris\/\",\"https:\/\/x.com\/jonahharris\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Revisiting Embedded InnoDB - Oracle Internals","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/oracle-internals.com\/blog\/2018\/09\/18\/revisiting-embedded-innodb\/","og_locale":"en_US","og_type":"article","og_title":"Revisiting Embedded InnoDB - Oracle Internals","og_description":"Many people these days don&#8217;t know InnoDB was originally developed as an independent database engine apart from MySQL.\u00a0Its author, Heikki Tuuri, modeled InnoDB after\u00a0Transaction Processing: Concepts and Techniques, the seminal transaction processing book authored by Turing Award laureate James &#8220;Jim&#8221; Gray and Andreas Reuter. It wasn&#8217;t until later InnoDB was integrated with MySQL. While InnoDB [&hellip;]","og_url":"https:\/\/oracle-internals.com\/blog\/2018\/09\/18\/revisiting-embedded-innodb\/","og_site_name":"Oracle Internals","article_published_time":"2018-09-18T04:14:21+00:00","article_modified_time":"2018-09-18T20:28:45+00:00","author":"Jonah Harris","twitter_card":"summary_large_image","twitter_creator":"@jonahharris","twitter_site":"@jonahharris","twitter_misc":{"Written by":"Jonah Harris","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/oracle-internals.com\/blog\/2018\/09\/18\/revisiting-embedded-innodb\/#article","isPartOf":{"@id":"https:\/\/oracle-internals.com\/blog\/2018\/09\/18\/revisiting-embedded-innodb\/"},"author":{"name":"Jonah Harris","@id":"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/549d9c522c3960b062618b600bb762a4"},"headline":"Revisiting Embedded InnoDB","datePublished":"2018-09-18T04:14:21+00:00","dateModified":"2018-09-18T20:28:45+00:00","mainEntityOfPage":{"@id":"https:\/\/oracle-internals.com\/blog\/2018\/09\/18\/revisiting-embedded-innodb\/"},"wordCount":425,"publisher":{"@id":"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/549d9c522c3960b062618b600bb762a4"},"articleSection":["Databases","InnoDB"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/oracle-internals.com\/blog\/2018\/09\/18\/revisiting-embedded-innodb\/","url":"https:\/\/oracle-internals.com\/blog\/2018\/09\/18\/revisiting-embedded-innodb\/","name":"Revisiting Embedded InnoDB - Oracle Internals","isPartOf":{"@id":"http:\/\/oracle-internals.com\/blog\/#website"},"datePublished":"2018-09-18T04:14:21+00:00","dateModified":"2018-09-18T20:28:45+00:00","breadcrumb":{"@id":"https:\/\/oracle-internals.com\/blog\/2018\/09\/18\/revisiting-embedded-innodb\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oracle-internals.com\/blog\/2018\/09\/18\/revisiting-embedded-innodb\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/oracle-internals.com\/blog\/2018\/09\/18\/revisiting-embedded-innodb\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"http:\/\/oracle-internals.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Revisiting Embedded InnoDB"}]},{"@type":"WebSite","@id":"http:\/\/oracle-internals.com\/blog\/#website","url":"http:\/\/oracle-internals.com\/blog\/","name":"Oracle Internals","description":"Researching the Inner Workings of the World&#039;s Most Powerful Database","publisher":{"@id":"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/549d9c522c3960b062618b600bb762a4"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/oracle-internals.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/549d9c522c3960b062618b600bb762a4","name":"Jonah Harris","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/image\/","url":"http:\/\/1.gravatar.com\/avatar\/a6d16ed0f510e8de0929f129471dc1e5?s=96&d=mm&r=g","contentUrl":"http:\/\/1.gravatar.com\/avatar\/a6d16ed0f510e8de0929f129471dc1e5?s=96&d=mm&r=g","caption":"Jonah Harris"},"logo":{"@id":"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/in\/jonahharris\/","https:\/\/x.com\/jonahharris"]}]}},"_links":{"self":[{"href":"http:\/\/oracle-internals.com\/blog\/wp-json\/wp\/v2\/posts\/96"}],"collection":[{"href":"http:\/\/oracle-internals.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/oracle-internals.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/oracle-internals.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/oracle-internals.com\/blog\/wp-json\/wp\/v2\/comments?post=96"}],"version-history":[{"count":5,"href":"http:\/\/oracle-internals.com\/blog\/wp-json\/wp\/v2\/posts\/96\/revisions"}],"predecessor-version":[{"id":102,"href":"http:\/\/oracle-internals.com\/blog\/wp-json\/wp\/v2\/posts\/96\/revisions\/102"}],"wp:attachment":[{"href":"http:\/\/oracle-internals.com\/blog\/wp-json\/wp\/v2\/media?parent=96"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/oracle-internals.com\/blog\/wp-json\/wp\/v2\/categories?post=96"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/oracle-internals.com\/blog\/wp-json\/wp\/v2\/tags?post=96"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}