mysql导入文件或数据或执行相关SQL
- mysql -h主机地址 -u用户名 -p用户密码,文件形式。(shell命令行)
mysql -u root -p dbname < filename.sql
- 直接放在命令行(shell命令行)执行一个sql
mysql -hhostname -uusername -p dbname -e 'select * from tbname limit 1'
执行后命令行会提示输入数据库密码。
- 把SQL作为一个输入给MYSQL(shell命令行)
echo 'select id from dbname.tbname where id = 1;' | mysql -hhostname -ureadonly -preadonly dbname > xxxx.sql
- 进入mysql数据库(数据库中执行SQL文件)
>source xxx.sql
导出库表(mysqldump)
- mysqldump -u用户名 -p密码 -h主机 数据库 a -w “sql条件” –lock-all-tables > 路径
mysqldump -hhostname -uusername -p dbname tbname>xxxx.sql
- 按指定条件导出数据库表内容。(-w选项 –where)
mysqldump -hhostname -uusername-p dbname tbname -w'id >= 1 and id<= 10000'--skip-lock-tables > xxxx.sql
- 或这下一行
mysqldump -hhostname -uusername -p dbname tbname --where='unit_id >= 1 and unit_id <= 10000'> ~/xxxx.sql
mysqldump导出库表详细举
- 导出整个数据库
mysqldump -u 用户名 -p数据库名 > 导出的文件名 >mysqldump -u breezelark-p mydb > mydb.sql
- 导出一个表(包括数据结构及数据)
mysqldump -u 用户名 -p数据库名 表名> 导出的文件名 mysqldump -u lingxi -p mydb mytb> mytb.sql
- 导出一个数据库结构(无数据只有结构)
mysqldump -u lingxi -p -d --add-drop-table mydb >mydb.sql
-d 没有数据–add-drop-table 在每个create语句之前增加一个 drop table 当然这只是导 入导出的其中一种方法,大家可以感觉自己的情况选择适合自己的方法。
应用举例
导出
- 导出全库备份到本地的目录
mysqldump -u$USER -p$PASSWD -h127.0.0.1 -P3306 --routines --default-character-set=utf8 --lock-all-tables --add-drop-database -A > db.all.sql
导出指定库到本地的目录(例如mysql库)
mysqldump -u$USER -p$PASSWD -h127.0.0.1 -P3306 --routines --default-character-set=utf8 --databases mysql > db.sql
- 导出某个库的表到本地的目录(例如mysql库的user表)
mysqldump -u$USER -p$PASSWD -h127.0.0.1 -P3306 --routines --default-character-set=utf8 --tables mysql user> db.table.sql
- 导出指定库的表(仅数据)到本地的目录(例如mysql库的user表,带过滤条件)
mysqldump -u$USER -p$PASSWD -h127.0.0.1 -P3306 --routines --default-character-set=utf8 --no-create-db --no-create-info --tables mysql user --where="host='localhost'"> db.table.sql
- 导出某个库的所有表结构
mysqldump -u$USER -p$PASSWD -h127.0.0.1 -P3306 --routines --default-character-set=utf8 --no-data --databases mysql > db.nodata.sql
- 导出某个查询sql的数据为txt格式文件到本地的目录(各数据值之间用"制表符"分隔)例 如sql为'select user,host,password from mysql.user;'
mysql -u$USER -p$PASSWD -h127.0.0.1 -P3306 --default-character-set=utf8 --skip-column-names -B -e 'select user,host,password from mysql.user;' > mysql_user.txt
- 导出某个查询sql的数据为txt格式文件到MySQL服务器. 登录MySQL,将默认的制表符换成 逗号.(适应csv格式文件). 指定的路径,mysql要有写的权限.最好用tmp目录,文件用完之 后,再删除!
SELECT user,host,password FROM mysql.user INTO OUTFILE '/tmp/mysql_user.csv' FIELDS TERMINATED BY ',';
导入
- 恢复全库数据到MySQL,因为包含mysql库的权限表,导入完成需要执行
FLUSH PRIVILEGES;
命令第一种方法:
mysql -u$USER -p$PASSWD -h127.0.0.1 -P3306 --default-character-set=utf8 < db.all.sql
第二种方法: 登录MySQL,执行source命令,后面的文件名要用绝对路径.
mysql> source /tmp/db.all.sql;
- 恢复某个库的数据(mysql库的user表) 第一种方法:
mysql -u$USER -p$PASSWD -h127.0.0.1 -P3306 --default-character-set=utf8 mysql < db.table.sql
第二种方法: 登录MySQL,执行source命令,后面的文件名要用绝对路径.
mysql -u$USER -p$PASSWD -h127.0.0.1 -P3306 --default-character-set=utf8 mysql> use mysql; mysql> source /tmp/db.table.sql;
- 恢复MySQL服务器上面的txt格式文件(需要FILE权限,各数据值之间用"制表符"分隔)
mysql -u$USER -p$PASSWD -h127.0.0.1 -P3306 --default-character-set=utf8 mysql> use mysql; mysql> LOAD DATA INFILE '/tmp/mysql_user.txt' INTO TABLE user ;
- 恢复MySQL服务器上面的csv格式文件(需要FILE权限,各数据值之间用"逗号"分隔)
mysql -u$USER -p$PASSWD -h127.0.0.1 -P3306 --default-character-set=utf8 mysql> use mysql; mysql> LOAD DATA INFILE '/tmp/mysql_user.csv' INTO TABLE user FIELDS TERMINATED BY ',';
- 恢复本地的txt或csv文件到
MySQLmysql -u$USER -p$PASSWD -h127.0.0.1 -P3306 --default-character-set=utf8 mysql> use mysql; # txt mysql> LOAD DATA LOCAL INFILE '/tmp/mysql_user.csv' INTO TABLE user; # csv mysql> LOAD DATA LOCAL INFILE '/tmp/mysql_user.csv' INTO TABLE user FIELDS TERMINATED BY ',';
注意事项
- 关于MySQL连接
-u$USER 用户名
-p$PASSWD 密码
-h127.0.0.1 如果连接远程服务器,请用对应的主机名或者IP地址替换
-P3306 端口
--default-character-set=utf8 指定字符集
- 关于mysql参数
--skip-column-names 不显示数据列的名字
-B 以批处理的方式运行mysql程序.查询结果将显示为制表符间隔格式.
-e 执行命令后,退出
- 关于mysqldump参数
-A 全库备份
--routines 备份存储过程和函数
--default-character-set=utf8 设置字符集
--lock-all-tables 全局一致性锁
--add-drop-database 在每次执行建表语句之前,先执行DROP TABLE IF EXIST语句
--no-create-db 不输出CREATE DATABASE语句
--no-create-info 不输出CREATE TABLE语句
--databases 将后面的参数都解析为库名
--tables 第一个参数为库名 后续为表名
- 关于LOAD DATA语法如果LOAD DATA语句不带LOCAL关键字,就在MySQL的服务器上直接读取 文件,且要具有FILE权限. 如果带LOCAL关键字,就在客户端本地读取数据文件,通过网络 传到MySQL. LOAD DATA语句,同样被记录到binlog,不过是内部的机制.
最近需要在mysql中把一个表中的某些字段下的数据导出接着再导入到另外个数据库中,常 用的mysqldump指令无法选定某个字段导出,只能使用-w选项来进行where筛选。查了很多相 关资料,终于解决了这个问题。下面把实现的过程总结一下。
首先,创建数据库来做个例子:
create table if not exists `score` ( `id` int(11) unsigned not null auto_increment, `name` varchar(16) not null, `score` int(3) not null default 0, primary key (`id`) ) engine=MyISAM default charset=utf8; insert into `score` (`name`, `score`)values ('张三', 80), ('李四', 85), ('a', 90), ('b', 95), ('c', 100);
导出数据:
select `name`,`score` from `score` into outfile '/Users/levin/dev/sql/score.sql';
上面的语句导出的文件是不带字段名的,如果需要带上字段名,将字段名字和结果集union 一下就好了:
select 'name','score' union select `name`,`score` from `score` into outfile '/Users/levin/dev/sql/score.sql';
将此纯文本的文件导入数据库中:
load data infile '/Users/levin/dev/sql/score.sql' into table `score` character set utf8 fields terminated by '\t' lines terminated by '\n' ignore 1 lines (`name`, `score`);
如果需要into outfile能生成可以直接执行的语句在导出时就需要利用concat函数做处理, 注意数据中的'需要处理好
select concat('(\'', replace(name, '\'', '\'\''), '\',\'', score, '\'', '),') from `score` into outfile '/Users/levin/dev/sql/score.sql';
生成的文件内容像这样:
('张三','80'),
('李四','85'),
('a','90'),
('b','95'),
('c','100'),
这样的文件还需要手动做些处理以实现批量导入的效果,打开文本以后将最后的,换成;,再 在最前面加上语句:
insert into `score` (`name`, `score`)values