### 15.20.3 设置 InnoDB memcached 插件

本节介绍如何设置`daemon_memcached`MySQL 服务器上的插件。因为**内存缓存**daemon 与 MySQL 服务器紧密集成，以避免网络流量并最大限度地减少延迟，您在每个使用此功能的 MySQL 实例上执行此过程。

笔记

在设置之前`daemon_memcached`插件，咨询[第 15.20.5 节，“InnoDB memcached 插件的安全注意事项”](innodb-memcached-security.html)了解防止未经授权的访问所需的安全程序。

#### 先决条件

-   这`daemon_memcached`插件仅在 Linux、Solaris 和 macOS 平台上受支持。不支持其他操作系统。

-   从源代码构建 MySQL 时，您必须使用[`-DWITH_INNODB_MEMCACHED=ON`](source-configuration-options.html#option_cmake_with_innodb_memcached).此构建选项在 MySQL 插件目录中生成两个共享库 ([`插件目录`](server-system-variables.html#sysvar_plugin_dir)) 需要运行`daemon_memcached`插入：

    -   `libmemcached.so`： 这**内存缓存**MySQL 的守护进程插件。

    -   `innodb_engine.so`： 一个`InnoDB`API 插件**内存缓存**.

-   `libevent`必须安装。

    -   如果您没有从源代码构建 MySQL，则`libevent`库不包含在您的安装中。使用适合您操作系统的安装方法进行安装`libevent`1.4.12 或更高版本。例如，根据操作系统，您可以使用`apt-get`,`百胜`， 要么`端口安装`.例如，在 Ubuntu Linux 上，使用：

        ```
        sudo apt-get install libevent-dev
        ```

    -   如果您从源代码版本安装 MySQL，`libevent`1.4.12 与包捆绑在一起，位于 MySQL 源代码目录的顶层。如果您使用捆绑版本的`libevent`，无需任何操作。如果要使用本地系统版本`libevent`，你必须用[`-DWITH_LIBEVENT`](source-configuration-options.html#option_cmake_with_libevent)构建选项设置为`系统`要么`是的`.

#### 安装和配置 InnoDB memcached 插件

[](<>)[](<>)[](<>)

1.  配置`daemon_memcached`插件，因此它可以与`InnoDB`通过运行表`innodb_memcached_config.sql`配置脚本，位于`*`MYSQL_HOME`*/分享`.此脚本安装`innodb_memcache`具有三个必需表的数据库（`缓存策略`,`配置选项`， 和`容器`）。它还安装了`演示测试`样本表中`测试`数据库。

    ```
    mysql> source MYSQL_HOME/share/innodb_memcached_config.sql
    ```

    运行`innodb_memcached_config.sql`脚本是一次性操作。如果您稍后卸载并重新安装`daemon_memcached`插入。

    ```
    mysql> USE innodb_memcache;
    mysql> SHOW TABLES;
    +---------------------------+
    | Tables_in_innodb_memcache |
    +---------------------------+
    | cache_policies            |
    | config_options            |
    | containers                |
    +---------------------------+

    mysql> USE test;
    mysql> SHOW TABLES;
    +----------------+
    | Tables_in_test |
    +----------------+
    | demo_test      |
    +----------------+
    ```

    在这些表中，`innodb_memcache.containers`表是最重要的。中的条目`容器`表提供到的映射`InnoDB`表列。每个`InnoDB`与表一起使用`daemon_memcached`插件需要在`容器`桌子。

    这`innodb_memcached_config.sql`脚本在`容器`提供映射的表`演示测试`桌子。它还将单行数据插入到`演示测试`桌子。此数据允许您在设置完成后立即验证安装。

    ```
    mysql> SELECT * FROM innodb_memcache.containers\G
    *************************** 1. row ***************************
                      name: aaa
                 db_schema: test
                  db_table: demo_test
               key_columns: c1
             value_columns: c2
                     flags: c3
                cas_column: c4
        expire_time_column: c5
    unique_idx_name_on_key: PRIMARY

    mysql> SELECT * FROM test.demo_test;
    +----+------------------+------+------+------+
    | c1 | c2               | c3   | c4   | c5   |
    +----+------------------+------+------+------+
    | AA | HELLO, HELLO     |    8 |    0 |    0 |
    +----+------------------+------+------+------+
    ```

    有关更多信息`innodb_memcache`表和`演示测试`样品表，见[第 15.20.8 节，“InnoDB memcached 插件内部”](innodb-memcached-internals.html).

2.  激活`daemon_memcached`通过运行插件[`安装插件`](install-plugin.html)陈述：

    ```
    mysql> INSTALL PLUGIN daemon_memcached soname "libmemcached.so";
    ```

    插件安装后，每次重启 MySQL 服务器时都会自动激活。

#### 验证 InnoDB 和 memcached 设置

验证`daemon_memcached`插件设置，使用**远程登录**发出的会话**内存缓存**命令。默认情况下，**内存缓存**守护进程侦听端口 11211。

1.  从`test.demo_test`桌子。中的单行数据`演示测试`表的键值为`AA`.

    ```
    telnet localhost 11211
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    get AA
    VALUE AA 8 12
    HELLO, HELLO
    END
    ```

2.  使用插入数据`放`命令。

    ```
    set BB 10 0 16
    GOODBYE, GOODBYE
    STORED
    ```

    在哪里：

    -   `放`是存储值的命令

    -   `BB`是关键

    -   `10`是操作的标志；被忽略**内存缓存**但可由客户用来指示任何类型的信息；指定`0`如果未使用

    -   `0`是过期时间（TTL）；指定`0`如果未使用

    -   `16`是提供的值块的长度（以字节为单位）

    -   `再见，再见`是存储的值

3.  通过连接到 MySQL 服务器并查询`test.demo_test`桌子。

    ```
    mysql> SELECT * FROM test.demo_test;
    +----+------------------+------+------+------+
    | c1 | c2               | c3   | c4   | c5   |
    +----+------------------+------+------+------+
    | AA | HELLO, HELLO     |    8 |    0 |    0 |
    | BB | GOODBYE, GOODBYE |   10 |    1 |    0 |
    +----+------------------+------+------+------+
    ```

4.  返回到 telnet 会话并检索您之前使用 key 插入的数据`BB`.

    ```
    get BB
    VALUE BB 10 16
    GOODBYE, GOODBYE
    END
    quit
    ```

    如果你关闭 MySQL 服务器，它也会关闭集成**内存缓存**服务器，进一步尝试访问**内存缓存**数据因连接错误而失败。通常情况下，**内存缓存**此时数据也会消失，您需要应用程序逻辑将数据加载回内存中**内存缓存**重新启动。然而`InnoDB` **内存缓存**插件为您自动执行此过程。

    当你重新启动 MySQL 时，`得到`操作再次返回您之前存储的键值对**内存缓存**会议。当请求一个键并且关联的值不在内存缓存中时，会自动从 MySQL 中查询该值`test.demo_test`桌子。

#### 创建新表和列映射

这个例子展示了如何设置你自己的`InnoDB`表与`daemon_memcached`插入。

1.  创建一个`InnoDB`桌子。该表必须有一个具有唯一索引的键列。城市表的关键列是`city_id`，它被定义为主键。该表还必须包含以下列`旗帜`,`cas`， 和`到期`价值观。可能有一个或多个值列。这`城市`表具有三个值列（`姓名`,`状态`,`国家`）。

    笔记

    对列名没有特殊要求，只要将有效映射添加到`innodb_memcache.containers`桌子。

    ```
    mysql> CREATE TABLE city (
           city_id VARCHAR(32),
           name VARCHAR(1024),
           state VARCHAR(1024),
           country VARCHAR(1024),
           flags INT,
           cas BIGINT UNSIGNED,
           expiry INT,
           primary key(city_id)
           ) ENGINE=InnoDB;
    ```

2.  将条目添加到`innodb_memcache.containers`表，以便`daemon_memcached`插件知道如何访问`InnoDB`桌子。条目必须满足`innodb_memcache.containers`表定义。有关每个字段的说明，请参阅[第 15.20.8 节，“InnoDB memcached 插件内部”](innodb-memcached-internals.html).

    ```
    mysql> DESCRIBE innodb_memcache.containers;
    +------------------------+--------------+------+-----+---------+-------+
    | Field                  | Type         | Null | Key | Default | Extra |
    +------------------------+--------------+------+-----+---------+-------+
    | name                   | varchar(50)  | NO   | PRI | NULL    |       |
    | db_schema              | varchar(250) | NO   |     | NULL    |       |
    | db_table               | varchar(250) | NO   |     | NULL    |       |
    | key_columns            | varchar(250) | NO   |     | NULL    |       |
    | value_columns          | varchar(250) | YES  |     | NULL    |       |
    | flags                  | varchar(250) | NO   |     | 0       |       |
    | cas_column             | varchar(250) | YES  |     | NULL    |       |
    | expire_time_column     | varchar(250) | YES  |     | NULL    |       |
    | unique_idx_name_on_key | varchar(250) | NO   |     | NULL    |       |
    +------------------------+--------------+------+-----+---------+-------+
    ```

    这`innodb_memcache.containers`city 表的表项定义为：

    ```
    mysql> INSERT INTO `innodb_memcache`.`containers` (
           `name`, `db_schema`, `db_table`, `key_columns`, `value_columns`,
           `flags`, `cas_column`, `expire_time_column`, `unique_idx_name_on_key`)
           VALUES ('default', 'test', 'city', 'city_id', 'name|state|country',
           'flags','cas','expiry','PRIMARY');
    ```

    -   `默认`被指定为`容器。名称`列来配置`城市`表作为默认值`InnoDB`要与`daemon_memcached`插件。

    -   倍数`InnoDB`表列(`名称`,`状态`,`国`)映射到`容器。值_列`使用“|”分隔符。

    -   这个`旗帜`,`cas_栏`和`过期时间列`田野`innodb_memcache。容器`表在使用`daemon_memcached`插件。然而，指定的`InnoDB`表列是每个项目所必需的。插入数据时，请指定`0`如果这些列未使用，请将其删除。

3.  在更新`innodb_memcache。容器`表，重新启动`daemon_memcache`应用更改的插件。

    ```
    mysql> UNINSTALL PLUGIN daemon_memcached;

    mysql> INSTALL PLUGIN daemon_memcached soname "libmemcached.so";
    ```

4.  使用telnet将数据插入`城市`使用**memcached** `设置`命令

    ```
    telnet localhost 11211
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    set B 0 0 22
    BANGALORE|BANGALORE|IN
    STORED
    ```

5.  使用MySQL查询`测验城市`表来验证您插入的数据是否已存储。

    ```
    mysql> SELECT * FROM test.city;
    +---------+-----------+-----------+---------+-------+------+--------+
    | city_id | name      | state     | country | flags | cas  | expiry |
    +---------+-----------+-----------+---------+-------+------+--------+
    | B       | BANGALORE | BANGALORE | IN      |     0 |    3 |      0 |
    +---------+-----------+-----------+---------+-------+------+--------+
    ```

6.  使用MySQL，将其他数据插入`测验城市`桌子

    ```
    mysql> INSERT INTO city VALUES ('C','CHENNAI','TAMIL NADU','IN', 0, 0 ,0);
    mysql> INSERT INTO city VALUES ('D','DELHI','DELHI','IN', 0, 0, 0);
    mysql> INSERT INTO city VALUES ('H','HYDERABAD','TELANGANA','IN', 0, 0, 0);
    mysql> INSERT INTO city VALUES ('M','MUMBAI','MAHARASHTRA','IN', 0, 0, 0);
    ```

    笔记

    建议您指定的值为`0`对于`旗帜`, `cas_栏`和`过期时间列`字段（如果未使用）。

7.  使用telnet发布**memcached** `收到`命令检索使用MySQL插入的数据。

    ```
    get H
    VALUE H 0 22
    HYDERABAD|TELANGANA|IN
    END
    ```

#### 配置InnoDB memcached插件

传统的`memcached`配置选项可以在MySQL配置文件或[**mysqld**](mysqld.html)启动字符串，编码在[`daemon_memcached_选项`](innodb-parameters.html#sysvar_daemon_memcached_option)配置参数。`memcached`配置选项在加载插件时生效，每次启动MySQL服务器时都会发生这种情况。

例如，使**memcached**在端口11222而不是默认端口11211上侦听，指定`-p11222`作为[`daemon_memcached_选项`](innodb-parameters.html#sysvar_daemon_memcached_option)配置选项：

```
mysqld .... --daemon_memcached_option="-p11222"
```

另外**memcached**选项可以在[`daemon_memcached_选项`](innodb-parameters.html#sysvar_daemon_memcached_option)一串例如，您可以指定选项以减少同时连接的最大数量、更改键值对的最大内存大小或启用错误日志的调试消息，等等。

还有一些特定于的配置选项`daemon_memcached`插件。这些措施包括：

-   [`daemon_memcached_engine_lib_name`](innodb-parameters.html#sysvar_daemon_memcached_engine_lib_name)：指定实现的共享库`InnoDB` **memcached**插件。默认设置为`innodb_引擎。所以`.

-   [`daemon_memcached_engine_lib_path`](innodb-parameters.html#sysvar_daemon_memcached_engine_lib_path)：包含实现共享库的目录的路径`InnoDB` **memcached**插件。默认值为NULL，表示插件目录。

-   [`daemon_memcached_r_批大小`](innodb-parameters.html#sysvar_daemon_memcached_r_batch_size)：定义读取操作的批提交大小(`收到`)。它指定了**memcached**读操作之后[犯罪](glossary.html#glos_commit)发生。[`daemon_memcached_r_批大小`](innodb-parameters.html#sysvar_daemon_memcached_r_batch_size)默认情况下设置为1，以便`收到`请求访问数据库中最近提交的数据`InnoDB`表，数据是否通过**memcached**或者通过SQL。当该值大于1时，读取操作的计数器会随着每个值的增加而增加`收到`呼叫A.`齐齐`调用重置读写计数器。

-   [`daemon_memcached_w_batch_size`](innodb-parameters.html#sysvar_daemon_memcached_w_batch_size)：定义写入操作的批提交大小(`设置`, `代替`, `追加`, `预编`, `增量`, `法令`，等等）。[`daemon_memcached_w_batch_size`](innodb-parameters.html#sysvar_daemon_memcached_w_batch_size)默认情况下设置为1，以便在发生中断时不会丢失未提交的数据，并使基础表上的SQL查询访问最新的数据。当该值大于1时，写入操作的计数器每次递增`添加`, `设置`, `增量`, `法令`和`删去`呼叫A.`齐齐`调用重置读写计数器。

    默认情况下，不需要修改[`daemon_memcached_engine_lib_name`](innodb-parameters.html#sysvar_daemon_memcached_engine_lib_name)或[`daemon_memcached_engine_lib_path`](innodb-parameters.html#sysvar_daemon_memcached_engine_lib_path)。例如，如果要使用其他存储引擎进行存储，则可以配置这些选项**memcached**（如国家发展银行）**memcached**发动机）。

`daemon_memcached`插件配置参数可以在MySQL配置文件或[**mysqld**](mysqld.html)启动字符串。它们在加载时生效`daemon_memcached`插件。

在更改`daemon_memcached`插件配置，重新加载插件以应用更改。为此，发布以下声明：

```
mysql> UNINSTALL PLUGIN daemon_memcached;

mysql> INSTALL PLUGIN daemon_memcached soname "libmemcached.so";
```

重新启动插件时，会保留配置设置、所需的表和数据。

有关启用和禁用插件的更多信息，请参阅[第5.6.1节，“安装和卸载插件”](plugin-loading.html).
