docker compose:mysql语法错误“delimiter”在第1行

jmp7cifd  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(323)

我有一个问题,我希望docker compose在设置mysql后直接导入我的database.sql文件。但它总是给我一个错误:
sql语法有错误;请查看与mysql服务器版本对应的手册,以获取在第1行“delimiter |”附近使用的正确语法
但不知何故,当我通过浏览器中的phpmyadmin导入它时,它工作得非常好。
这是我的 docker-compose.yml :

version: "3.2"
services:
  php:
    build: './php/'
    networks:
      - backend
    volumes:
      - ./www/:/var/www/html/
  apache:
    build: './apache/'
    depends_on:
      - php
      - mysql
    networks:
      - frontend
      - backend
    ports:
      - "8081:80"
    volumes:
      - ./www/:/var/www/html/
  mysql:
    image: mysql:5.7
    volumes:
      - ./mysql:/tmp/database
    command: mysqld --max_allowed_packet=32505856 --user=root --init-file="/tmp/database/schema.sql"
    networks:
      - backend
    environment:
      - MYSQL_ROOT_PASSWORD=root
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    links:
        - mysql
    ports:
      - '8082:80'
    environment:
      MYSQL_USERNAME: root
      MYSQL_ROOT_PASSWORD: root
      PMA_HOST: mysql
    networks:
      - backend
networks:
  frontend:
  backend:

这是执行的.sql文件的一个示例片段:

-- phpMyAdmin SQL Dump
-- version 4.8.2
-- https://www.phpmyadmin.net/
--
-- Host: mysql
-- Generation Time: Aug 20, 2018 at 08:30 AM
-- Server version: 5.7.23
-- PHP Version: 7.2.6
DELIMITER $$

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";

--
-- Database: `database`
--
CREATE DATABASE IF NOT EXISTS `databasetest` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
USE `databasetest`;

--
-- Procedures
--
DROP PROCEDURE IF EXISTS `sp_filestatus_get`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_filestatus_get` (IN `filename_name` VARCHAR(500), IN `kampagne_name` VARCHAR(100), IN `outlet_name` VARCHAR(100))  NO SQL

... Some more stuff

END;

配置中有什么遗漏吗?或者为什么它不能与compose一起工作,而直接在phpmyadmin中工作?

py49o6xq

py49o6xq1#

如果你真的需要 DELIMITER 语句,您可以将mysql的命令更改为 bash -c "service mysql start && echo 'xx' && mysql --max_allowed_packet=32505856 -u root -proot < /tmp/database/schema.sql && while true; do sleep 1; done" 那么它应该在没有任何其他变化的情况下工作。
因此,您的mysql部分应该如下所示:

mysql:
    image: mysql:5.7
    volumes:
      - ./mysql:/tmp/database
    command: bash -c "service mysql start && echo 'xxxxxxxxxxxxxxxxx' && mysql --max_allowed_packet=32505856 -u root -proot < /tmp/database/schema.sql && while true; do sleep 1; done"
    networks:
      - backend
    environment:
      - MYSQL_ROOT_PASSWORD=root

解释其工作原理:
之前,您使用 mysqld 命令并指定初始化脚本。现在它作为一项服务启动。这带来了一个优点和一个缺点。
优点:现在可以使用 mysql 命令。
缺点:在指定 mysql 命令,容器将被docker停止。
为了克服缺点,我补充说 while true; do sleep 1; done 作为最后的命令。这会导致容器运行直到停止。这个 echo 我只是想让你看看命令是怎么执行的。

eivgtgni

eivgtgni2#

这个 DELIMETER sql api不直接支持,因为该语句的支持是由在phpmyadmin中工作的客户端定义的,因为它支持该语句。默认值 mysql 客户使用 delimeter 语句,按照存储程序中建议的步骤定义并相应地更新sql文件( CREATE PROCEDURE 将替换为sql语句)。

mysql> delimiter //

mysql> CREATE PROCEDURE dorepeat(p1 INT)
    -> BEGIN
    ->   SET @x = 0;
    ->   REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

根据您正在使用的脚本,您必须以与现在不同的方式处理delimeter:
替换

DROP PROCEDURE IF EXISTS `sp_filestatus_get`$$

DROP PROCEDURE IF EXISTS `sp_filestatus_get`;

另外,请更换 END;END $$ 并添加 DELIMITER ; 在文件末尾。
以下是一些链接,可供您在init sql脚本中查找要调整的内容时使用:
mysql 5.6中的delimeter问题
在mysqlcommand中使用分隔符时出现语法错误
delimeter或

相关问题