我需要自动将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 */;
答案 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 */;