【问题标题】:How to call this shell script to convert mysqldump to SQLite compatible syntax如何调用此 shell 脚本将 mysqldump 转换为 SQLite 兼容语法
【发布时间】:2015-02-28 22:32:22
【问题描述】:

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

脚本在 cmets 中说明了如何调用它。我相信我的场景与第一个名为 usage 的场景相匹配,因为我已经有了 mysqldump 文件。

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

我在 github 页面上阅读了 cmets 以使用 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 myShellFile.sh 的 .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 */;

【问题讨论】:

  • /bin/sh^M:您的脚本有 Windows 行结尾 (/r/n)。第一行 (shebang) 说明应该使用哪个程序来运行脚本。在sed -i 's/^M//' mysql2sqlite 之后效果更好(你应该输入 ^M 作为 ctrl-v ctrl-m),或者你可以用 dos2unix 或编辑器删除 ^M 吗?
  • Notepad++有换行符,我试试
  • 之后我用这个输出再次运行它:` mysqldump: Got error: 1045: Access denied for user 'pi'@'localhost' (using password: NO) when trying to connect memory`

标签: mysql linux bash sqlite shell


【解决方案1】:

您误解了脚本中的 cmets。该脚本需要 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 */;

【讨论】:

  • 我的数据库很简单。只有 4 个表,只有字符串和整数。我认为这应该对我有用。
  • 听起来很像。改变那条线,你应该做生意了。
  • 这并没有完全解决它。我发布了 sqldump,以便确定问题。
  • 这给出了一个错误:SQL 错误:无法识别的令牌:“`” 如果这需要手动编辑 sql 文件,那么这将不起作用。我可能每天这样做数百次,这是不可行的。感谢您的帮助,但这可能永远不应该尝试。我只需要找到一个不同的工作流程。如果您想了解更多关于为什么必须自动化的信息,请查看链接的link
  • 如果您按预期使用该脚本应该可以工作,并且我相信您的脚本的答案是正确的。如果您将其标记为这样(为了我的努力),将不胜感激。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-17
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多