使用 putty 将 sql.gz 文件导入并插入数据库

Posted

技术标签:

【中文标题】使用 putty 将 sql.gz 文件导入并插入数据库【英文标题】:Import and insert sql.gz file into database with putty 【发布时间】:2012-06-13 20:32:33 【问题描述】:

我想使用 SSH 将 sql.gz 文件插入我的数据库。我该怎么办?

例如,我有一个来自电话号码的数据库,名称为 numbers.sql.gz,这种文件是什么类型的文件,如何将这个文件导入我的数据库?

【问题讨论】:

【参考方案1】:

使用像 putty 这样的 shell 程序登录到您的服务器。

在命令行输入以下命令

zcat DB_File_Name.sql.gz | mysql -u username -p Target_DB_Name

在哪里

DB_File_Name.sql.gz = 要导入的 sql.gz 文件的完整路径

username = 你的 mysql 用户名

Target_DB_Name = 要导入数据库的数据库名称

当你在命令行中敲回车时,它会提示输入密码。输入您的 MySQL 密码。

你已经完成了!

【讨论】:

如果您想避免浪费磁盘空间(和时间),这是最好的答案。 这对我帮助很大 @hafichuk 从 gz 文件导入比直接从 sql 文件导入数据快吗? @daudichya 一般来说,你必须做的磁盘操作越少越好 在 macOS 上使用 zcat < DB_File_Name.sql.gz 代替(注意 <)。【参考方案2】:

该文件是一个 gzip 压缩(压缩)的 SQL 文件,几乎可以肯定是一个以 .sql 作为扩展名的纯文本文件。您需要做的第一件事是通过 scp 将文件复制到您的数据库服务器。I think PuTTY's is pscp.exe

# Copy it to the server via pscp
C:\> pscp.exe numbers.sql.gz user@serverhostname:/home/user

然后通过 SSH 连接到您的服务器并使用 gunzip 解压缩文件

user@serverhostname$  gunzip numbers.sql.gz
user@serverhostname$  ls 

numbers.sql

最后,使用< 输入重定向运算符将其导入您的 MySQL 数据库:

user@serverhostname$  mysql -u mysqluser -p < numbers.sql

如果 numbers.sql 文件没有创建数据库,但希望数据库已经存在,则您还需要在命令中包含该数据库:

user@serverhostname$  mysql -u mysqluser -p databasename < numbers.sql

如果您能够从外部直接连接到 MySQL 服务器,那么您可以使用本地 MySQL 客户端,而不必复制和 SSH。在这种情况下,您只需要一个可以在 Windows 上解压缩 .gz 文件的实用程序。我相信 7zip 会这样做,或者您可以获取 Windows 的 gzip/gunzip binaries。

【讨论】:

方法太老了,需要多个步骤。请按照@seshu 的回答来简单地完成它。【参考方案3】:

无需单独的步骤来提取存档:

# import gzipped-mysql dump
gunzip < DUMP_FILE.sql.gz | mysql --user=DB_USER --password DB_NAME

我用上面的sn -p重新导入mysqldump-backups,下面的用来备份。

# mysqldump and gzip (-9 ≃ highest compression)
mysqldump --user=DB_USER --password DB_NAME | gzip -9 > DUMP_FILE.sql.gz

【讨论】:

@Wasim 恢复到命令中没有PASSWORD 的版本。除非绝对必要,否则不应直接在命令行上指定密码。在大多数系统上,shell 命令存储在像.bash_history 这样的历史文件中,因此直接在命令中指定的密码也存储在该历史文件中。如果您遗漏密码,MySQL 会以交互方式提示它。如果你真的需要在命令中包含密码,你应该用空格字符缩进命令,这样可以防止命令被记录到 shell 历史中。【参考方案4】:

对于oneliner,在linux或cygwin上,你需要在主机上做公钥认证,否则ssh会要求输入密码。


gunzip -c numbers.sql.gz | ssh user@host mysql --user=user_name --password=your_password db_name

或者做端口转发并使用“本地”连接连接到远程mysql:

ssh -L some_port:host:local_mysql_port user@host

然后在你的本地机器上做 mysql 连接到 localhost:some_port

端口转发也可以在 putty 中使用,使用类似的 -L 选项,或者您可以从树上某处的设置面板中对其进行配置。

【讨论】:

oneliner 很不错,但会导致数据库密码出现在您的命令历史记录中,这通常是不安全的。 除非他在命令行中使用--defaults-file而不是密码【参考方案5】:

如果你有 scp 那么:

要将文件从本地移动到远程:

$scp /home/user/file.gz user@ipaddress:path/to/file.gz 

要将文件从远程移动到本地:

$scp user@ipaddress:path/to/file.gz /home/user/file.gz

在不登录远程系统的情况下导出你的mysql文件:

$mysqldump -h ipaddressofremotehost -Pportnumber -u usernameofmysql -p  databasename | gzip -9 > databasename.sql.gz

在不登录远程系统的情况下导入你的mysql文件:

$gunzip < databasename.sql.gz | mysql -h ipaddressofremotehost -Pportnumber -u usernameofmysql -p 

注意:确保您对远程主机的 ipaddress 具有网络访问权限

检查网络访问:

$ping ipaddressofremotehost

【讨论】:

【参考方案6】:

如果您有很多数据库,它会导入并且转储很大(我经常使用数千兆字节的 Gzipped 转储)。

这里有一种方法可以在 mysql 中进行。

$ mkdir databases
$ cd databases
$ scp user@orgin:*.sql.gz .  # Here you would just use putty to copy into this dir.
$ mkfifo src
$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.41-0
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database db1;
mysql> \! ( zcat  db1.sql.gz > src & )
mysql> source src
.
.
mysql> create database db2;
mysql> \! ( zcat  db2.sql.gz > src & )
mysql> source src

这是唯一的优势

zcat db1.sql.gz | mysql -u root -p 

是您无需多次输入密码即可轻松完成多个操作。

【讨论】:

【参考方案7】:

如果 mysql 转储是一个 .gz 文件,您需要通过键入 gunzip 来解压缩文件 $ gunzip mysqldump.sql.gz

这将解压缩 .gz 文件,并将 mysqldump.sql 存储在同一位置。

输入以下命令导入sql数据文件:

$ mysql -u username -p -h localhost test-database

【讨论】:

【参考方案8】:

在当前服务器上创建转储文件 SQL.gz

$ sudo apt-get install pigz pv

$ pv | mysqldump --user=<yourdbuser> --password=<yourdbpassword> <currentexistingdbname> --single-transaction --routines --triggers --events --quick --opt -Q --flush-logs --allow-keywords --hex-blob --order-by-primary --skip-comments --skip-disable-keys --skip-add-locks --extended-insert --log-error=/var/log/mysql/<dbname>_backup.log | pigz > /path/to/folder/<dbname>_`date +\%Y\%m\%d_\%H\%M`.sql.gz

可选:连接的命令参数

--host=127.0.0.1 / localhost / IP Address of the Dump Server
--port=3306

将上面创建的转储文件导入到不同的服务器

$ sudo apt-get install pigz pv

$ zcat /path/to/folder/<dbname>_`date +\%Y\%m\%d_\%H\%M`.sql.gz | pv | mysql --user=<yourdbuser> --password=<yourdbpassword> --database=<yournewdatabasename> --compress --reconnect --unbuffered --net_buffer_length=1048576 --max_allowed_packet=1073741824 --connect_timeout=36000 --line-numbers --wait --init-command="SET GLOBAL net_buffer_length=1048576;SET GLOBAL max_allowed_packet=1073741824;SET FOREIGN_KEY_CHECKS=0;SET UNIQUE_CHECKS = 0;SET AUTOCOMMIT = 1;FLUSH NO_WRITE_TO_BINLOG QUERY CACHE, STATUS, SLOW LOGS, GENERAL LOGS, ERROR LOGS, ENGINE LOGS, BINARY LOGS, LOGS;"

可选:连接的命令参数

--host=127.0.0.1 / localhost / IP Address of the Import Server
--port=3306

mysql: [警告] 在命令行界面上使用密码可能是不安全的。 1.0GiB 00:06:51 [8.05MiB/s] [ ]

可选的软件包有助于更快地导入数据库 SQL 文件

带有进度视图 (pv) 并行 gzip (pigz/unpigz) 到 gzip/gunzip 文件并行

为了更快地压缩输出

【讨论】:

以上是关于使用 putty 将 sql.gz 文件导入并插入数据库的主要内容,如果未能解决你的问题,请参考以下文章

使用 wamp 服务器将数据库导入 mysql localhost

MySQL数据库导入成功但不起作用

text 用mysql cli导入.sql.gz db

无法使用 Putty 访问 SSH 到 Arvixe 共享主机 [关闭]

putty里删除替换多行(整段)

无法使用Putty访问SSH到Arvixe共享主机[关闭]