01. mysql (客户端连接工具)
这里的"mysql"不是指mysql服务,也不是指mysql数据库,而是指连接数据库的客户端工具,它是操作者和数据库之间的纽带和桥梁。
以下两种方式等价:- 表示单词缩写,-- 表示完整单词。其他选项可以使用 mysql --help 命令进行查看。
- mysql -uroot
- mysql --user=root
01. 连接选项
-u, --user=name 指定用户名
-p, --password[=name] 指定密码
-h, --host=name 指定服务器IP或者域名
-P, --port=3306 指定连接端口,默认3306
-D, --database=name 指定连接的数据库
这5个选项经常一起配合使用。在默认情况下,如果这些选项不写,那么mysql将会使用 ‘用户名’@‘localhost’ 和 空密码 连接本机上的3306端口。空用户 在mysql刚刚安装完毕后会自动生成,这也就是我们只使用一个mysql命令就可以连接到数据库的原因。
[root@ufo128 ~]# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.1.73 Source distribution
Copyright (c) 2000, 2013, 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>
查看当前用户(为空用户)
mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| @localhost |
+----------------+
1 row in set (0.00 sec)
如果单纯的删除了空用户,那木用单纯的mysql命令是不是就永远不能登录了呢? 不是的,如果空用户被删除,mysql会接着去my.cnf里边找[client]组内的用户名和密码,如果有则按照此用户名和密码进行登录(必须是已经存在的用户);如果没有记录此选项,则系统会使用’root’@'localhost’用户进行登录。
如果客户端和服务器位于同一台机器上,通常不需要指定-h选项,否则需要指定mysql服务所在的IP或主机名。如果不指定端口,默认会连接到3306端口。下边是一个远程连接服务器的例子:
# 注意用户名和密码参数之间没有空格
[root@ufo128 ~]# mysql -h 192.168.71.130 -P 3306 -uroot -pUfo_123456
02. 客户端字符集选项
作为服务器的字符集选项,这个选项也可以配置在mysql.cnf的 [mysqld] 组中。同样,作为客户端字符集选项,也可以配置在mysql.cnf的 [mysql] 组中,这样每次用mysql工具连接数据库的时候就会自动使用此客户端字符集。当然也可以在mysql的命令行手工指定客户端字符集。
[root@ufo128 ~]# mysql -u root --default-character-set=utf8
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 5.1.73 Source distribution
Copyright (c) 2000, 2013, 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> show variables like 'chara%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 ### |
| character_set_connection | utf8 ### |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 ### |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
原来默认的客户端字符集
mysql> show variables like 'chara%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 ### |
| character_set_connection | latin1 ### |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 ### |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
03. 执行选项
-e, --execute=name 执行sql语句并退出
对于一些批量处理脚本,这种方式尤为方便。
[root@ufo128 ~]# mysql -e "select host,user from mysql.user;"
+-----------+------+
| host | user |
+-----------+------+
| 127.0.0.1 | root |
| localhost | |
| localhost | root |
| ufo | |
| ufo | root |
+-----------+------+
[root@ufo128 ~]# mysql -e "select host,user from mysql.user; select current_user();"
+-----------+------+
| host | user |
+-----------+------+
| 127.0.0.1 | root |
| localhost | |
| localhost | root |
| ufo | |
| ufo | root |
+-----------+------+
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
04. 格式化选项
-E,--vertical 将输出方式按照字段顺序竖着显示
-s,--silent 去掉mysql中的线条框显示
“-E"选项类似于mysql中的”\G",可以将内容比较多的行更清晰完整的进行显示,经常和"-e"选项一起使用。
[root@ufo128 ~]# mysql -e "select host,user from mysql.user;"
+-----------+------+
| host | user |
+-----------+------+
| 127.0.0.1 | root |
| localhost | |
| localhost | root |
| ufo | |
| ufo | root |
+-----------+------+
[root@ufo128 ~]# mysql -E -e "select host,user from mysql.user;"
*************************** 1. row ***************************
host: 127.0.0.1
user: root
*************************** 2. row ***************************
host: localhost
user:
*************************** 3. row ***************************
host: localhost
user: root
*************************** 4. row ***************************
host: ufo
user:
*************************** 5. row ***************************
host: ufo
user: root
[root@ufo128 ~]# mysql -s -e "select host,user from mysql.user;"
host user
127.0.0.1 root
localhost
localhost root
ufo
ufo root
05. 错误处理选项
-f, --force 强制执行sql
-v, --verbose 显示更多信息
--show-warnings 显示警告信息
在一个批处理的sql中,如果有其中一个sql执行出错,正常情况下,该批处理将停止退出。加上-f选项,则跳过出错的sql,强制执行后面的sql;加上-v选项,则显示出错的sql语句;加上--show-warnings,则会显示全部的错误信息。
创建测试表
mysql> create table t2(id int(11));
Query OK, 0 rows affected (0.02 sec)
mysql> desc t2;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
测试数据
[root@ufo128 tmp]# cat 666.sql
insert into t2 values(1);
insert into t2 values(2a);
insert into t2 values(3);
不加任何参数将数据导入表t2
[root@ufo128 tmp]# mysql -uroot -D test < 666.sql
ERROR 1054 (42S22) at line 2: Unknown column '2a' in 'field list'
[root@ufo128 tmp]#
[root@ufo128 tmp]# mysql -uroot -D test -e "select * from t2;"
+------+
| id |
+------+
| 1 |
+------+
注意:只提交了前边正确的数据
加-f选项强制导入
[root@ufo128 tmp]# mysql -uroot -D test -f < 666.sql
ERROR 1054 (42S22) at line 2: Unknown column '2a' in 'field list'
[root@ufo128 tmp]#
[root@ufo128 tmp]# mysql -uroot -D test -e "select * from t2;"
+------+
| id |
+------+
| 1 |
| 1 |
| 3 |
+------+
注意:跳过中间语法报错的语句,强制执行后边的语句,但是提示信息不够明确,不易定位
加入-v选项
[root@ufo128 tmp]# mysql -uroot -D test -f -v < 666.sql
--------------
insert into t2 values(1)
--------------
--------------
insert into t2 values(2a)
--------------
ERROR 1054 (42S22) at line 2: Unknown column '2a' in 'field list'
--------------
insert into t2 values(3)
--------------
[root@ufo128 tmp]# mysql -uroot -D test -e "select * from t2;"
+------+
| id |
+------+
| 1 |
| 1 |
| 3 |
| 1 |
| 3 |
+------+
注意:提示信息更明确,易于定位
修改测试数据,测试告警提示
[root@ufo128 tmp]# cat 666.sql
insert into t2 values(1);
insert into t2 values(22222222222222222222222222);
insert into t2 values(3);
[root@ufo128 tmp]# mysql -uroot -D test -f -v < 666.sql
--------------
insert into t2 values(1)
--------------
--------------
insert into t2 values(22222222222222222222222222)
--------------
--------------
insert into t2 values(3)
--------------
[root@ufo128 tmp]# mysql -uroot -D test -e "select * from t2;"
+------------+
| id |
+------------+
| 1 |
| 1 |
| 3 |
| 1 |
| 3 |
| 1 |
| 2147483647 |
| 3 |
+------------+
注意:超出了存储范围,但是没有任何告警提示信息。(因为没有设置SQL_MODE,默认为非严格的数据效验,也就是第二条数据虽然可以插入表t2,但是插入的数据时错误的)
[root@ufo128 tmp]# mysql -uroot -D test -f -v --show-warnings < 666.sql
--------------
insert into t2 values(1)
--------------
--------------
insert into t2 values(22222222222222222222222222)
--------------
Warning (Code 1264): Out of range value for column 'id' at row 1
Warning (Code 1264): Out of range value for column 'id' at row 1
--------------
insert into t2 values(3)
--------------
[root@ufo128 tmp]# mysql -u root -D test -e "select * from t2;"
+------------+
| id |
+------------+
| 1 |
| 1 |
| 3 |
| 1 |
| 3 |
| 1 |
| 2147483647 |
| 3 |
| 1 |
| 2147483647 |
| 3 |
+------------+
注意:插入数据异常,且有告警提示。
06. 其他
生成html格式,特别适合输出为报告
[root@ufo128 tmp]# mysql -uroot -Dtest -e "select * from t2;" -H
<TABLE BORDER=1><TR><TH>id</TH></TR><TR><TD>1</TD></TR><TR><TD>1</TD></TR><TR><TD>3</TD></TR><TR><TD>1</TD></TR><TR><TD>3</TD></TR><TR><TD>1</TD></TR><TR><TD>2147483647</TD></TR><TR><TD>3</TD></TR><TR><TD>1</TD></TR><TR><TD>2147483647</TD></TR><TR><TD>3</TD></TR></TABLE>
生成xml格式,特别适合程序捞取数据并传输
[root@ufo128 tmp]# mysql -uroot -Dtest -e "select * from t2;" -X
-N 跳过不显示输出列名,-s不显示输出分隔符
[root@ufo128 tmp]# mysql -uroot -Dtest -e "select current_user();"
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
[root@ufo128 tmp]# mysql -uroot -Dtest -e "select current_user();" -N
+----------------+
| root@localhost |
+----------------+
[root@ufo128 tmp]# mysql -uroot -Dtest -s -e "select current_user();" -N
root@localhost
-V 查看mysql版本
[root@ufo128 tmp]# mysql -V
mysql Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1
一个简单shell脚本示例
#! /bin/bash
# 登录mysql,不输出分隔符,不显示列名,可用shell传递变量
# 数据库与shell来回切换使用命令
mysql=`which mysql`
table_name="mysql.user"
${mysql} -N -s << EOF
system echo ""
select current_user();
system echo ""
select now();
system echo ""
select host,user from ${table_name};
system echo ""
system echo ${mysql}
system echo ${table_name}
EOF
# 也可以追加到文件,进行后续文件处理
${mysql} -N -s >> 6666.sql << EOF
system echo ""
select current_user();
EOF
cat 6666.sql
# 也可以直接利用选项输出,或利用重定向输入文件等等
${mysql} -N -s -e "select current_user();" >> 66666.sql
cat 66666.sql
# 也可以登录后加载执行sql文件, source AAA.sql