首页 > 数据库 >MySQL启动时自动创建数据库

MySQL启动时自动创建数据库

时间:2022-11-19 00:56:33浏览次数:67  
标签:name 创建 数据库 sql echo MysqL MySQL docker

一、背景及分析

MysqL容器启动时,会自动创建一些必要的数据库,比如MysqL,这是官方认的做法。但是,在实际中,还需要让MysqL自动创建我们自定义数据库。本文就此应用场合进行探究。

一般的做法是,启动容器并挂载数据目录后,使用MysqL客户端连接服务器,再手动输入sql语句创建(或导入.sql文件),当然也可以直接在容器内创建(方法同上)。由于挂载了数据目录,因此可持久化保存。但是,这些方法在部署数据库比较繁琐,不方便,特别是在初测阶段,会频繁地从头开始搭建环境。

如果能在MysqL容器启动时,自动执行我们自己的.sql文件,就不需要那么麻烦了,其实MysqL容器的启动脚本已经考虑了这种场合。通过MysqL镜像构建脚本docker-entrypoint.sh(参考这里
),发现如下语句:

  1. for f in /docker-entrypoint-initdb.d/*; do
  2. process_init_file "$f" "${MysqL[@]}"
  3. done

process_init_file函数定义如下:

  1. process_init_file() {
  2. local f="$1"; shift
  3. local MysqL=( "$@" )
  4. case "$f" in
  5. *.sh) echo "$0: running $f"; . "$f" ;;
  6. *.sql) echo "$0: running $f"; "${MysqL[@]}" < "$f"; echo ;;
  7. *.sql.gz) echo "$0: running $f"; gunzip -c "$f" | "${MysqL[@]}"; echo ;;
  8. *) echo "$0: ignoring $f" ;;
  9. esac
  10. echo
  11. }

从上面语句看到,脚本将需要执行的文件(如.sh或.sql)放到/docker-entrypoint-initdb.d目录下,那么docker-entrypoint.sh就会自动执行。明白了原理,解决方案就十分简单了。

二、解决方

2.1 Dockerfile

内容如下:

  1. FROM MysqL:5.7
  2. copY sql/*.sql /docker-entrypoint-initdb.d/

为了方便起见,所有.sql文件都放到Dockerfile同级的sql目录。

2.2 准备好sql文件

下面是测试用的.sql文件文件名为test.sql内容如下:

  1. -- 创建db_test数据库
  2. create database `db_test` default character set utf8 collate utf8_general_ci;
  3. use db_test;
  4. -- 创建用户
  5. DROP TABLE IF EXISTS `user`;
  6. CREATE TABLE `user` (
  7. `id` bigint(20) NOT NULL,
  8. `email` varchar(255) DEFAULT NULL,
  9. `first_name` varchar(255) DEFAULT NULL,
  10. `last_name` varchar(255) DEFAULT NULL,
  11. `username` varchar(255) DEFAULT NULL,
  12. PRIMARY KEY (`id`)
  13. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  14. -- 插入数据
  15. INSERT INTO `user` (`id`, `email`, `first_name`, `last_name`, `username`)
  16. VALUES(0,'[email protected]','Late','Lee','latelee');

主要内容是创建user表,并插入测试的数据。

2.3 创建镜像

  1. docker build -t MysqLtest .

创建镜像名称MysqLtest,注意最后的点号.,表示使用当前目录的Dockerfile

2.4 容器启动

docker-compose.yml文件内容如下:

  1. version: '2'
  2. services:
  3. database:
  4. image: MysqLtest
  5. #image: singula/MysqL
  6. container_name: MysqL
  7. ports:
  8. - "3406:3306"
  9. volumes:
  10. - ./MysqL_data:/var/lib/MysqL
  11. - /home:/home
  12. environment:
  13. MysqL_ROOT_PASSWORD: 123456

使用下列命令启动:

  1. docker-compose up -d

验证数据库表:

  1. $ docker exec -it MysqL bash
  2. bash-4.2# MysqL -uroot -p123456
  3. MysqL> use db_test;
  4. MysqL> select * from user;
  5. +----+----------------+------------+-----------+----------+
  6. | id | email | first_name | last_name | username |
  7. +----+----------------+------------+-----------+----------+
  8. | 0 | [email protected] | Late | Lee | latelee |
  9. +----+----------------+------------+-----------+----------+
  10. 1 row in set (0.00 sec)

使用如下语句修改邮箱地址:

  1. update user set email='cst@cststudio.com.cn' where username='latelee';

退出容器后,停止容器:

  1. docker-compose down

再次重复上述命令启动、查看数据,可以看到邮件地址是最新的,从而验证了数据能永久存储。

三、实践指导

.sql脚本只有第一次启动时创建(或说没有数据库时则会创建),已创建的,不会覆盖掉,否则这个机制就无法正式应用项目中。

.sql脚本中,也可以创建账号、密码,这样就不用在docker-compose文件指定环境变量了。起到了一定的保护作用。

如果要完全迁移数据,需要将数据目录(文中为MysqL_data目录)与docker-compose.yml文件一起迁移。

标签:name,创建,数据库,sql,echo,MysqL,MySQL,docker
From: https://www.cnblogs.com/exmyth/p/16905319.html

相关文章

  • MySQL关联查询
    一、关联查询1、概念在查询数据时,所需要的数据不只在一张表中,可能在两张或多张表中。这个时候,需要同时操作这些表来查询数据,即关联查询。关联查询所涉及到的表与表之间都......
  • 通过docker部署grafana和mysql
    阅读本文需要一定的Linux,Docker与MySQL知识,例如:会启动容器,进入容器;会创建表,会使用INSERT语句,会使用SELECT语句...1.简介2.网络设置-2.1docker网络......
  • MySQL
    数据库当中最基本的单位是表:table姓名性别年龄(列:字段)张三男20—->行(记录)李四女21王五男22数据库当中是以表格的形式表示数据的因为表......
  • MySQL的SQL优化常用30种方法[转]
    MySQL的SQL优化常用30种方法1、对查询进行优化,应尽量避免全表扫描,首先应考虑在where及orderby涉及的列上建立索引。2、应尽量避免在where子句中使用!=或<>操作符,......
  • VMware创建Win10操作系统虚拟机
    VMware创建Win10操作系统虚拟机1.安装VMware16迅雷云链接:https://pan.xunlei.com/s/VNH9mkbxLqnyB_F_g0h73C_TA1?pwd=sdi4#2.下载Win10镜像百度云链接:https://pan.ba......
  • 开发笔记1.1-配置可视化MySQL工具phpMyAdmin
    配置好phpMyAdmin前提是需要安装http服务器、php、phpMyAdmin1.安装http服务器#安装httpd服务器yuminstallhttpd#开启http服务器并设置开机启动sudosystemctlst......
  • 安装conda(mini)后创建虚拟环境时报错:"In general, it's not advisable to use 'sudo
    报错信息:解决办法:(使用下面的命令改变conda相关文件夹的权限,-r递归应用于子文件夹) sudochmod777-R~/miniconda3/  sudochmod777-R~/.conda/  解决。......
  • STM32CubeMX+Keil5环境创建
    1、打开桌面的STM32CubMX软件2、点击File→NewProject创建新的项目 3、选择合适的芯片型号,因为本人是F103ZET6,故选择,双击确定。4、选择合适调试接口 5、将外部......
  • 同步与异步、阻塞与非阻塞、综合使用、创建进程的多种方式、进程间数据隔离、进程的jo
    同步与异步用来表达任务的提交方式同步 提交完任务之后原地等待任务的返回结果期间不做任何事异步 提交完任务之后不愿地等待任务的返回结果直接去做其他事有结果......
  • redis集群创建的时候,一直卡在Waiting for the cluster to join ....上、一直没有反应
    1.问题:搭建Redis集群的过程中,执行到clustercreate:…的时候,发现程序发生阻塞,显示:Waitingfortheclustertojoin的字样,然后就无休无尽的等待…2.解决方法:开放red......