如何调用此shell脚本将mysqldump转换为SQLite兼容语法

时间:2015-02-28 22:32:22

标签: mysql linux bash sqlite shell

我需要自动将mysqldump文件(.sql文件)转换为SQLite兼容的.sql文件。我在github上找到了这个script,它应该可以做到这一点。如果我有一个来自MySQL的未经修改的.sql文件,名为test.sql,其数据库的名称为test,而目录中的脚本为mysql2sqlite.sh,我该怎么称呼它。

脚本在评论中说如何调用它。我相信我的场景与第一个标题用法相匹配,因为我已经有了mysqldump文件。

# Usage: $ ./mysql2sqlite mysqldump-opts db-name | sqlite3 database.sqlite
# Example: $ ./mysql2sqlite --no-data -u root -pMySecretPassWord myDbase | sqlite3 database.sqlite

我在github页面上的注释中读到了使用chmod +x mysql2sqlite.sh更改脚本权限,因此导航到带有sql和脚本的目录并执行了该操作。 然后我试了一下:

pi@raspberrypi ~ $ ./mysql2sqlite.sh test.sql test | sqlite3 database.sqlite

失败并显示错误:-bash: ./mysql2sqlite.sh: /bin/sh^M: bad interpreter: No such file or directory

然后我在网上读到要调用.sh文件,你输入sh myShellFile.sh

所以我试过sh mysql2sqlite.sh test.sql test | sqlite3 database.sqlite 然后回来了:

: not founde.sh: 2: mysql2sqlite.sh:
: not founde.sh: 5: mysql2sqlite.sh:
: not founde.sh: 8: mysql2sqlite.sh:
: not founde.sh: 11: mysql2sqlite.sh:
: not founde.sh: 13: mysql2sqlite.sh:
: not founde.sh: 14: mysql2sqlite.sh:
mysqldump: Got error: 1045: Access denied for user 'pi'@'localhost' (using password: NO) when trying to connect
: not founde.sh: 15: mysql2sqlite.sh:

它似乎尝试连接到服务器而不是读取我提供的mysqldump文件。调用此脚本的正确方法是什么。我有一些Linux经验,没有使用unix shell的经验。

阅读problem

的背景可能会有所帮助

编辑:编辑脚本的第一行后再次运行它会产生错误Error: near line 4: near "Insert": syntax error

这是我正在尝试处理的sqldump:

-- phpMyAdmin SQL Dump
-- version 4.1.14
-- http://www.phpmyadmin.net
--
-- Host: 127.0.0.1
-- Generation Time: Feb 28, 2015 at 06:00 AM
-- Server version: 5.6.17
-- PHP Version: 5.5.12

SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `test`
--

-- --------------------------------------------------------

--
-- Table structure for table `testtable`
--

CREATE TABLE IF NOT EXISTS `testtable` (
  `FirstName` varchar(30) NOT NULL,
  `LastName` varchar(30) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `testtable`
--

INSERT INTO `testtable` (`FirstName`, `LastName`) VALUES
('', ''),
('Josh', 'Kallus'),
('', ''),
('Josh', 'Kallus');

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

1 个答案:

答案 0 :(得分:1)

您错误地解释了脚本中的评论。该脚本需要mysql转储选项,后跟dbname(不是转储文件)。如果您查看第一行代码,您将看到它是如何工作的。

mysqldump  --compatible=ansi --default-character-set=utf8 --compatible=ansi --skip-extended-insert --compact  "$@" | \ 

该脚本期望输出MySQL数据使用它也传递的参数,因此最好的方法可能是按预期使用脚本。

mysql2sqlite.sh -h my.host.com --single-transaction -umyuser -p mydb | sqlite3 database.sqlite 

如果你只能从现有的转储文件中执行此操作,那么可以将代码中的第一个mysqldump行更改为

cat $@ | \

然后你可以这样做

mysql2sqlite.sh test.sql | sqlite3 database.sqlite 

请记住,此脚本不是灵丹妙药,您可能会遇到其他不兼容问题。您可以通过直接编辑转储文件本身来解决它们。祝你好运。

http://dev.mysql.com/doc/refman/5.6/en/mysqldump.html

编辑:正如我最初所说的,这个脚本不是一个神奇的子弹,你可能需要编辑你的转储才能使它工作(使用它来构建转储功能的最佳兼容性)我已经编辑你的脚本到你在下面看到的,它应该工作。

-- phpMyAdmin SQL Dump
-- version 4.1.14
-- http://www.phpmyadmin.net
--
-- Host: 127.0.0.1
-- Generation Time: Feb 28, 2015 at 06:00 AM
-- Server version: 5.6.17
-- PHP Version: 5.5.12

SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `test`
--

-- --------------------------------------------------------

--
-- Table structure for table `testtable`
--

CREATE TABLE IF NOT EXISTS `testtable` (
  `FirstName` varchar(30) NOT NULL,
  `LastName` varchar(30) NOT NULL
);

--
-- Dumping data for table `testtable`
--

INSERT INTO `testtable` (`FirstName`, `LastName`) VALUES('', ''),('Josh', 'Kallus'),('', ''),('Josh', 'Kallus');

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;