如何在一个数据库上创建多个数据库 server/container
How to create many db on one db server/container
如何在一个 mysql 数据库容器上创建多个数据库?
或者我必须为每个数据库创建数据库容器吗?
当我尝试从 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 个数据库,为每个数据库创建专用容器是浪费资源。
首先,您需要使用 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'@'%';
如何在一个 mysql 数据库容器上创建多个数据库? 或者我必须为每个数据库创建数据库容器吗? 当我尝试从 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 个数据库,为每个数据库创建专用容器是浪费资源。
首先,您需要使用 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'@'%';