【问题标题】:How to create many db on one db server/container如何在一个数据库服务器/容器上创建多个数据库
【发布时间】:2019-11-25 10:38:18
【问题描述】:

如何在一个 mysql 数据库容器上创建多个数据库? 或者我是否必须为每个数据库创建 db 容器? 当我尝试从 sql 文件脚本创建它时:

    @ClassRule public static MySQLContainer dbService = (MySQLContainer) new MySQLContainer()
        .withPassword("test")
        .withUsername("mysqlroot")
        .withDatabaseName("test")
        .withInitScript("init_mysql.sql")
        .withExposedPorts(DB_PORT)
        .withNetwork(network)
        .withNetworkAliases("dbService")
        ;

我收到一个错误:

Caused by: org.testcontainers.ext.ScriptUtils$ScriptStatementFailedException: Script execution failed (init_mysql.sql:2): CREATE DATABASE IF NOT EXISTS `b2c`
at org.testcontainers.jdbc.JdbcDatabaseDelegate.execute(JdbcDatabaseDelegate.java:49)
at org.testcontainers.delegate.AbstractDatabaseDelegate.execute(AbstractDatabaseDelegate.java:34)
at org.testcontainers.ext.ScriptUtils.executeDatabaseScript(ScriptUtils.java:331)
... 19 more
Caused by: java.sql.SQLSyntaxErrorException: Access denied for user 'mysqlroot'@'%' to database 'b2c'
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.StatementImpl.executeInternal(StatementImpl.java:782)
    at com.mysql.cj.jdbc.StatementImpl.execute(StatementImpl.java:666)
    at org.testcontainers.jdbc.JdbcDatabaseDelegate.execute(JdbcDatabaseDelegate.java:42)
    ... 21 more

init_mysql.sql的内容

CREATE TABLE bar (
    foo VARCHAR(255)
);
CREATE DATABASE  IF NOT EXISTS `b2c`;

我尝试了很多配置。对我来说,除了在容器创建时配置的专用数据库外,我似乎无法执行 sql。 请帮忙。我有 6 个数据库,为每个数据库创建专用容器是浪费资源。

【问题讨论】:

  • 您是否尝试过使用此处提到的“使用文件中的初始化脚本”方法:testcontainers.org/modules/databases。你得到一个传递给你的 init 函数的连接,你可以在那里运行你所有的脚本(例如:创建你的 6 个数据库)。

标签: testcontainers


【解决方案1】:

首先,您需要使用root 用户名启动您的 MySQLContainer(以便获得执行初始化脚本的权限):

        new MySQLContainer<>(new DockerImageName(MYSQL_DOCKER_IMAGE))
            .withUsername("root")
            .withPassword("")
            .withEnv("MYSQL_ROOT_HOST", "%")
            .withInitScript("init_test_container_databases.sql")
            .withNetwork(NETWORK)
            .withNetworkAliases(MYSQL_NETWORK)
            .withStartupTimeout(Duration.ofSeconds(CONTAINER_STARTUP_TIMEOUT_SECONDS));

init_test_container_databases.sql 脚本(在我的示例中,我创建了两个具有相同用户的数据库,将由我的应用程序使用):

CREATE DATABASE IF NOT EXISTS your_database_1;
CREATE DATABASE IF NOT EXISTS your_database_2;
CREATE USER 'your_username'@'%' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON *.* TO 'your_username'@'%';

【讨论】:

    猜你喜欢
    • 2014-10-28
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 2020-05-23
    • 1970-01-01
    相关资源
    最近更新 更多