mysql 执行拼接命令_转 【MySQL】常用拼接语句 shell 下执行mysql 命令

【MySQL】常用拼接语句

前言:在MySQL中 CONCAT ()函数用于将多个字符串连接成一个字符串,利用此函数我们可以将原来一步无法得到的sql拼接出来,在工作中也许会方便很多,下面主要介绍下几个常用的场景。

注:适用于5.7版本 低版本可能稍许不同。

1.拼接查询所有用户

mysql">SELECT DISTINCT

CONCAT(

'User: \'',

USER,

'\'@\'',

HOST,

'\';'

) AS QUERY

FROM

mysql.USER;

# 当拼接字符串中出现'时 需使用\转义符

2.拼接DROP table

SELECT

CONCAT(

'DROP table ',

TABLE_NAME,

';'

)

FROM

information_schema. TABLES

WHERE

TABLE_SCHEMA = 'test';

3.拼接kill连接

SELECT concat('KILL ', id, ';') FROM information_schema. PROCESSLIST WHERE STATE LIKE 'Creating sort index';

4.拼接创建数据库语句

SELECT CONCAT( 'create database ', '`', SCHEMA_NAME, '`', ' DEFAULT CHARACTER SET ', DEFAULT_CHARACTER_SET_NAME, ';' ) AS CreateDatabaseQuery FROM information_schema.SCHEMATA WHERE SCHEMA_NAME NOT IN ( 'information_schema', 'performance_schema', 'mysql', 'sys' );

5.拼接创建用户的语句

SELECT CONCAT( 'create user \'', user, '\'@\'', Host, '\'' ' IDENTIFIED BY PASSWORD \'', authentication_string, '\';' ) AS CreateUserQuery FROM mysql.`user` WHERE `User` NOT IN ( 'root', 'mysql.session', 'mysql.sys' ); #有密码字符串哦 在其他实例执行 可直接创建出与本实例相同密码的用户

6.导出权限脚本 这个shell脚本也用到了拼接

#!/bin/bash #Function export user privileges pwd=yourpass expgrants() { mysql -B -u'root' -p${pwd} -N $@ -e "SELECT CONCAT( 'SHOW GRANTS FOR ''', user, '''@''', host, ''';' ) AS query FROM mysql.user" | \ mysql -u'root' -p${pwd} $@ | \ sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/-- \1 /;/--/{x;p;x;}' } expgrants > /tmp/grants.sql echo "flush privileges;" >> /tmp/grants.sql

7.查找表碎片

SELECT t.TABLE_SCHEMA, t.TABLE_NAME, t.TABLE_ROWS, concat(round(t.DATA_LENGTH / 1024 / 1024, 2), 'M') AS size, t.INDEX_LENGTH, concat(round(t.DATA_FREE / 1024 / 1024, 2), 'M') AS datafree FROM information_schema.tables t WHERE t.TABLE_SCHEMA = 'test' order by DATA_LENGTH desc;

8.查找无主键表 这个没用到拼接 也分享出来吧

#查找某一个库无主键表 SELECT table_schema, table_name FROM information_schema.TABLES WHERE table_schema = 'test' AND TABLE_NAME NOT IN ( SELECT table_name FROM information_schema.table_constraints t JOIN information_schema.key_column_usage k USING ( constraint_name, table_schema, table_name ) WHERE t.constraint_type = 'PRIMARY KEY' AND t.table_schema = 'test' ); #查找除系统库外 无主键表 SELECT t1.table_schema, t1.table_name FROM information_schema. TABLES t1 LEFT OUTER JOIN information_schema.TABLE_CONSTRAINTS t2 ON t1.table_schema = t2.TABLE_SCHEMA AND t1.table_name = t2.TABLE_NAME AND t2.CONSTRAINT_NAME IN ('PRIMARY') WHERE t2.table_name IS NULL AND t1.TABLE_SCHEMA NOT IN ( 'information_schema', 'performance_schema', 'mysql', 'sys' ) ;

#########PS:

mysql 查询后不显示标题

2018年10月22日 15:48:00 weixin_33872566 阅读数 2

mysql -h 146.240.54.1 -P 60028 -u dba -p123456 -Dtestdb

直接进入命令行,select,是有|显示的格式的。

mysql -h 146.240.54.1 -P 60028 -u dba -p123456 -Dtestdb<1.sql

这样使用批处理的方式执行,显示是没有|的。

mysql -h 146.240.54.1 -P 60028 -u dba -p123456 -Dtestdb -t<1.sql

如果增加了-t命令项,则会显示|格式

如果使用-vvv选项,则会回显命令。

mysql -h 146.240.54.1 -P 60028 -u dba -p123456 -Dtestdb -N<1.sql

如果使用-N选项,则不显示标题。

在mysql命令行下,可以直接执行批处理文件。

mysql>. 1.sql

作者:mydriverc2

来源:CSDN

原文:https://blog.csdn.net/mydriverc2/article/details/38895395

###3

https://www.cnblogs.com/wangkangluo1/archive/2012/04/27/2472898.html

在shell开发中,很多时候我们需要操作mysql数据库(比如:查询数据、导出数据等),但是我们又无法进入mysql命令行的环境,就需要在shell环境中模拟mysql的环境,使用mysql相关命令,本文总结几种shell操作mysql的方法,供大家参考。

方案1

mysql -uuser -ppasswd -e"insert LogTable values(...)"

优点:语句简单

缺点:支持的sql相对简单

方案2

准备一个sql脚本,名字为update.sql,例如:

CREATE TABLE `user` (

`id` varchar(36) NOT NULL COMMENT '主键',

`username` varchar(50) NOT NULL COMMENT '用户名',

`password` varchar(50) NOT NULL COMMENT '用户密码',

`createdate` date NOT NULL COMMENT '创建时间',

`age` int(11) NOT NULL COMMENT '年龄',

PRIMARY KEY  (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='用户信息表';

DROP TABLE IF EXISTS `visit_log`;

CREATE TABLE `visit_log` (

`id` varchar(36) character set utf8 NOT NULL,

`type` int(11) NOT NULL,

`content` text character set utf8 NOT NULL,

`createdate` date NOT NULL,

PRIMARY KEY  (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='访问日志';

新建一个update_mysql.sh,内容如下:

use chbdb;

source update.sql

然后执行如下命令:

cat update_mysql.sh | mysql --user=root -ppassword

优点:支持复杂的sql脚本

缺点:

1> 需要两个文件:update.sql和update_mysql.sh

2> 一旦中间出错,之后脚本就不会执行,例如:

如果第一张表已经存在,则会报出如下异常:

ERROR 1050 (42S01) at line 1 in file: 'update.sql': Table 'user' already exists

然后脚本退出,第二张表也就无法创建。

方案3

新建一个shell脚本,格式如下:

#!/bin/bash

mysql -u* -h* -p* <

Your SQL script.

EOF

例如:

#!/bin/bash

mysql -uroot  -ppassword <

use chbdb;

CREATE TABLE user (

id varchar(36) NOT NULL COMMENT '主键',

username varchar(50) NOT NULL COMMENT '用户名',

password varchar(50) NOT NULL COMMENT '用户密码',

createdate date NOT NULL COMMENT '创建时间',

age int(11) NOT NULL COMMENT '年龄',

PRIMARY KEY  (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='用户信息表';

优点:

1>支持复杂的sql脚本

2>无需其它额外文件

缺点:

1> 表名、字段不能使用单引号,需要修改原有sql语句

2> 一旦中间出错,之后脚本就不会执行,例如:

如果第一张表已经存在,则会报出如下异常:

ERROR 1050 (42S01) at line 1 in file: 'update.sql': Table 'user' already exists

然后脚本退出,第二张表也就无法创建。

方案4

准备一个sql脚本,如update.sql,然后执行如下命令:

mysql -uroot -ppassword 

优点:支持复杂的sql脚本

缺点:

1> 一旦中间出错,之后脚本就不会执行,例如:

如果第一张表已经存在,则会报出如下异常:

ERROR 1050 (42S01) at line 1 in file: 'update.sql': Table 'user' already exists

然后脚本退出,第二张表也就无法创建。

大家知道在mysql命令行中使用source命令,即使中间出错,后续脚本也会继续执行,但是如上几种方式,均无法解决该问题,如果大家有好的建议,请回复,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值