WL#7976: Deprecate skip-innodb in 5.6, remove in 5.7

Affects: Server-5.7   —   Status: Complete

The system tables are being moved from MyISAM to InnoDB, thus
in 5.7 it will be not possible to run the MySQL server without
InnoDB (which is the default SE since 5.5).

Thus the server options which turn off InnoDB should be deprecated
in 5.6 and removed in 5.7.

The options are:
  --skip-innodb
  --loose-skip-innodb
  --innodb=OFF
  --loose-innodb

The Cluster team has been consulted, and are OK with this change.

For reference, see 
http://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html

User Documentation
==================

http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-21.html
http://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-5.html

http://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#option_mysqld_innodb
http://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#option_mysqld_innodb
NOTE: all three options are referred as 'skip-innodb option' below.

Server changes
==============

Deprecation changes
-------------------

ServerPT decision is to:
  - deprecate in 5.6;
  - ignore in 5.7, issue a warning when skip-innodb is used;
  - completely remove in 5.8 (fail to start).

https://mediawiki.us.oracle.com/mysql/index.php/ServerPT#Wednesday.2C_25-Jun-2014_.40_6pm_CET

In other words:

  - 5.6: all forms of the skip-innodb option should give the standard
    deprecation warning. MTR tests should be updated to tolerate
    that.

  - 5.7: neither of the skip-innodb options disables InnoDB
    (i.e. there is no way to disable InnoDB in 5.7). However, using
    any of them (including loose-skip-innodb) results in the following
    warning being put into the error log:

    "
      The use of InnoDB is mandatory since MySQL 5.7.
      The former options like '--innodb=0/1/OFF/ON' or
      '--skip-innodb' are ignored
    "

  - 5.8: skip-innodb and innodb=OFF will result in an error as
    unknown options. loose-skip-innodb will have no effect (silently
    ignored as unknown option). There will be no way to disable InnoDB.

InnoDB changes
--------------

A new debug option (innodb_lock_no_retry) should be added, which instructs
InnoDB to fail immediately when locks can not be acquired on startup
(instead of making 100 attempts).

mysql-test-run.pl changes
-------------------------

The MTR should put the [embedded] section into the configuration file even
if it's run in the normal mode since there will be a test case which runs
embedded tools in the normal mode (and embedded tools require the
[embedded] section).

The MTR test suite changes
==========================

All tests using the skip-innodb option can be divided into the following
groups:

  1. Tests which use skip-innodb for decreasing the test time (by turning
    off InnoDB):

      - main.warnings
      - main.myisam-blob
      - main.no_threads
  
    The skip-innodb option can be simply removed for those tests without
    much visible effect.

  2. Tests which essentially depends on skip-innodb:

      - i_main.bootstrap
      - i_main.pid_file_issue
      - main.bootstrap
      - main.mysql_embedded
    
    The main reason for disabling InnoDB is the ability to start another
    server instance on the same data directory (MyISAM allows that, InnoDB
    does not). The general solution is to shutdown one server instance
    before starting another one so that there is only one active instance
    at a time.

    The tests in this group should be examined individually.

  3. Tests verifying skip-innodb behavior:
    
      - i_binlog.binlog_row_innodb_disabled
      - i_binlog.binlog_stm_mix_innodb_disabled
      - i_innodb.innodb_bug14756795
      - i_rpl.rpl_innodb_disabled
    
    Such tests should be disabled or removed.

  4. Dead code.

    The skip-innodb option is used in the following file

      - ndb_rpl_multi_binlog_update.cnf

    which is in turn used in files below

      - ndb_rpl_slave_lsu_anyval.cnf
      - ndb_rpl_slave_lsu.cnf

    However, none of these files seem to be used in real test cases.
    Also, the Cluster (NDB) lives in a different tree, so the files are
    mosy likely irrelevant.

Let's examine the tests from (2) in details.

bootstrap (i_main.bootstrap and main.bootstrap)
-----------------------------------------------

These tests check the server bootstrap mode by running mysqld with the
--bootstrap command line option.

In order to get rid of the skip-innodb option in the test script, the
server instance started by MTR should be stopped before running the server
in the bootstrap mode.

The opt-file has the skip-innodb option, but it actually doesn't matter
as the MTR server instance will be stopped anyway.

i_main.pid_file_issue
---------------------

The purpose of this test is to make sure that pid-file is not removed when
another server instance is attempted to start (i.e. start another server
instance conflicting with the previous one). The conflicting server
instance should fail to start without removing the pid-file of the 1st
instance.

With MyISAM another server instance failed to start due to conflicting
network parameters. With InnoDB another server instance fails to start due
to locks within InnoDB.

The solution is to introduce a special debug-option telling InnoDB to
report an error immediately (without making 100 attempts to acquire the
lock). Then, we'll set that debug-option for the second (conflicting)
server instance the test case is starting.

The proposed name for the debug-option: innodb_lock_no_retry

main.mysql_embedded
-------------------

This test used to be run in the embedded mode only, which means MTR started
an embedded server instance before executing mysql_embedded.test. The test
however does not use the started instance in any way. Instead, the test
runs the mysql_embedded tool to execute some custom queries. The
mysql_embedded tool starts another instance, so it is not possible to use
it without the skip-innodb option.

There is no way to shutdown an embedded server instance from MTR. There is
a separate on that (WL#7952: Enable shutdown & restart of embedded server
from MTR test).

The solution consists of the following items:

  - run mysql_embedded.test in the regular (not embedded) mode, meaning
    that a regular server instance will be started by MTR;

  - stop the server instance started by MTR in mysql_embedded.test before
    executing the mysql_embedded tool;

  - unfortunately, MTR in the embedded mode creates slightly different
    configuration. Thus, the mysql_embedded tool does not start with the
    configuration created for regular MTR run. In order to address that the
    following changes should be taken:

    - modify MTR so that the [embedded] section is always put in the
      configuration;

    - prepare special configuration file in the mysql_embedded.test which
      does not contain SSL-related options (the mysql_embedded tool does not
      work if they are present).