惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Latest news
Latest news
T
Troy Hunt's Blog
V
Vulnerabilities – Threatpost
L
LINUX DO - 热门话题
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
V
V2EX
博客园 - 司徒正美
B
Blog RSS Feed
AWS News Blog
AWS News Blog
MyScale Blog
MyScale Blog
Scott Helme
Scott Helme
Cisco Talos Blog
Cisco Talos Blog
Last Week in AI
Last Week in AI
NISL@THU
NISL@THU
博客园 - Franky
P
Proofpoint News Feed
博客园_首页
C
CERT Recently Published Vulnerability Notes
雷峰网
雷峰网
S
Schneier on Security
P
Proofpoint News Feed
Hugging Face - Blog
Hugging Face - Blog
G
GRAHAM CLULEY
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
WordPress大学
WordPress大学
The Hacker News
The Hacker News
T
Threatpost
阮一峰的网络日志
阮一峰的网络日志
A
Arctic Wolf
Microsoft Azure Blog
Microsoft Azure Blog
T
The Exploit Database - CXSecurity.com
Engineering at Meta
Engineering at Meta
罗磊的独立博客
T
The Blog of Author Tim Ferriss
D
Darknet – Hacking Tools, Hacker News & Cyber Security
I
Intezer
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
K
Kaspersky official blog
SecWiki News
SecWiki News
云风的 BLOG
云风的 BLOG
美团技术团队
C
Cybersecurity and Infrastructure Security Agency CISA
博客园 - 【当耐特】
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Security Latest
Security Latest
C
Cyber Attacks, Cyber Crime and Cyber Security
B
Blog
S
Security Affairs

博客园 - tooli

没有技术要求,只需5步就能完成数据分析和图表制作,DuckDB可将数据分析门槛铲平。 在超大数据集下 DuckDB 与 MySQL 查询速度对比 ChatGPT有多强?真的能替代程序员?一起来看看! 在windwos创建的脚本文件在linux环境中无法执行的问题 PHP + Redis 实现定时任务触发 测试PHP几种方法写入文件的效率与安全性 简析小黑是如何盗取cookie登录用户账号 一个'&'引起md5签名不一致问题 linux学习:curl与netcat用法整理 swoole+websocket+redis实现一对一聊天 使用COOKIE实现登录 VS 使用SESSION实现登录 巧用PHP中__get()魔术方法 用户表分表原理 linux学习:用户管理 linux学习:网络(防火墙)及系统安全相关命令学习 MySQL语句技巧 实习那些事儿 linux学习:归档,备份及进程相关命令用法整理 Docker简介以及使用docker搭建lnmp的过程(多PHP版本)
shell 环境下MySQL的基本操作指令总结
tooli · 2017-08-04 · via 博客园 - tooli

一、对数据库的基本操作 

mysql -h127.0.0.1 -P3306 -uroot -p -A  //登录数据库,-A参数指不预读数据库信息,否则如果数据表很多的话,执行use db_name;就会很慢。加-A参数连接,不去预读数据库信息。(注意:很多人会密码加在-p后面,但是这样密码会被系统指令执行记录日志给明文记录,会留下隐患,所以尽量不要把密码一并加在指令上去执行,而是单独输入)

mysql -h127.0.0.1 -P3306 -uroot -D dbname //-D参数指定连接某个数据库

show databases;                      //列出数据库
use database_name;               //使用database_name数据库
create database data_name;   //创建名为data_name的数据库
drop database data_name;     //删除一个名为data_name的数据库
use dbname; status                 //查看数据库dbname的详细信息

alter database db_name character set  utf8;  //修改数据库编码

show variables like '%dir%';    // 查看mysql相关存放目录

mysql -uroot -proot -e "select * from test.item;"   #在系统中使用mysql命令执行sql语句 

二、对表的基本操作

查看数据表的建表语句。

SHOW CREATE TABLE table_name;

1、列出所有表

show tables;

1.1、查询数据库 yf_role 中有多少张表

SELECT COUNT(*) TABLES, table_schema FROM information_schema.TABLES   WHERE table_schema = 'yf_role' GROUP BY table_schema;

1.2、获取某个数据库中每张表的基础信息

SELECT TABLE_NAME,ENGINE,TABLE_ROWS,TABLE_COLLATION,TABLE_COMMENT FROM information_schema.TABLES WHERE table_schema = 'yf_role';

2、查看表的详细信息:

show table status where name = 'table_name';    

3、优化表格,将已删除的数据的空间释放出来(delete操作删除数据后,空间并没有释放,而是等待新数据去填充),仅对MyISAM, BDB和InnoDB引擎表起作用。语句执行过程中,MySQL会锁定表。

optimize table  table_name;   

4、查询某个数据库某个表的字段信息

select * from information_schema.columns where TABLE_SCHEMA='数据库' and TABLE_NAME='表名'     

5、查询data_base.20171112_login的所有字段名

select COLUMN_NAME from information_schema.columns where table_schema='data_base' and table_name='20171112_login' 

6、创建一个名为tab_name的新表

create table tab_name( 
  id int(10) not null auto_increment primary key, 
  name varchar(40), 
  pwd varchar(40) 
) charset=gb2312;

eg: 

CREATE TABLE `test` (

  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

//id自增的时候从7开始(表示前面已经有6行数据了)

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1

 7、删除名为tab_name的数据表 

drop table tab_name  

8、显示名为tab_name的表的数据结构 
describe tab_name    或者   desc tab_name

show columns from tab_name  

9、删除表所有数据,不会重置自增的ID

delete from tab_name;    
truncate table  `db_name`.`tab_name`;    //截断表重置自增的id为0

10、插入与更新表内容

(1)插入

insert into table_name (列1, 列2,...) values (值1, 值2,....)

insert into report.user_live (date,pid,osid,level) values ('2017-07-26','3','0','2') 

insert into 表名称 values (值1, 值2,....)

insert into report.user_live  values ('2017-07-26','3','0','2') 

insert into table_name (列1, 列2,...) values (值1, 值2,....) on duplicate key update field=values(field);    //field是字段名称,如果插入是,主键已经重复,则更新给出字段。

例如:insert into report.user_live (date,pid,osid,level) values('2017-07-26','3','0','2') on duplicate key update level = values(level); 

插入这行数字时,主键是(date,pid,osid)复合主键,并且该主键的数据已经存在且唯一,此时出入多一行数据,则键非主键level字段更新到对应的唯一主键对应的记录中。

往表table1插入表table2的数据,前提是两个表结构一致,或者要插入的字段一致

表字段相同的情况:INSERT INTO  dbname.table1  select  *  FROM dbname.table2;       

表字段不同的情况:INSERT INTO dbname.table1 (a,b,c,d,e,f,g) SELECT a,b,c,d,e, x as f,y as g FROM dbname.table2;

(2)更新
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

 例如:UPDATE `mydb`.`mytable` SET `myname` = 'xst' WHERE `id` = '3';

以下实例将更新 id 为 3 的 content 字段值的 "C++" 替换为 "Python":

update db.table set content=replace(content, 'C++', 'Python') where id='3';

三、修改表结构

修改表名
alter table tab_name rename to new_tab_name;   

重命名数据表

RENAME TABLE `test`.`mytest` TO `test`.`mytest_back`; 

修改字段名,必须为当前字段指定数据类型等属性,否则不能修改 
alter table tab_name change old_col new_col varchar(40);    

 用一个已存在的表来建新表,但不包含旧表的数据
create table new_tab_name like old_tab_name;    

创建表table1复制表table2的结果

create  table  table1  like  table2;     

新增字段
alter table tab_name add col_name varchar(20);   

删除字段
alter table tab_name drop col_name;       

修改字段属性,若加上not null则要求原字段下没有数据            

alter table tab_name modify col_name varchar(40) not null;  

新增索引

ALTER TABLE `db_name`.`tab_name` ADD INDEX `index_name` (`col_name`);   

新增联合索引(符合最左前缀)

ALTER TABLE `db_name`.`tab_name` ADD INDEX `index_name` (`id`, `name`);  

指定使用B+树索引(使用 InnoDB和MyISAM引擎有效)

ALTER TABLE`db_name`.`tab_name`  ADD INDEX `index_name`(`id`, `name`) USING BTREE;

设置主键

alter table tab_name add primary key (col_name);   

删除主键
alter TABLE tab_name drop primary key (col_name);  

创建一个表复制另一个表的一些字段

create table newadmin as ( select username, password from admin );   

修改数据库默认字符集

ALTER DATABASE db_name DEFAULT CHARACTER SET character_name [COLLATE ...];     

修改表的默认字符集

ALTER TABLE tab_name DEFAULT CHARACTER SET character_name [COLLATE...];   

例如:ALTER TABLE logtest DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 

修改字段的字符集

ALTER TABLE tab_name CHANGE c_name c_name CHARACTER SET character_name [COLLATE ...]; 

例如:ALTER TABLE logtest CHANGE title title VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci; 

把表默认的字符集和所有字符列(CHAR,VARCHAR,TEXT)改为新的字符集

ALTER TABLE tbl_name CONVERT TO CHARACTER SET character_name [COLLATE ...]   

例如:ALTER TABLE logtest CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

四、用户与用户权限管理

1、赋予用户权限

方法一:先创建用户再赋予权限:

mysql -uroot -p123456

CREATE USER 'backend'@'%' IDENTIFIED BY 'Back123end';      //用户名backend,密码Back123end

GRANT ALL PRIVILEGES ON *.*  TO  backend;   //赋予该用户所有库所有表的所有权限

FLUSH PRIVILEGES;

grant select,update,insert,delete,create,index,show databases on *.* to backend;  //第一个 * 符号代表所有数据库,第二个 * 符号代表所有数据表,backend表示数据库用户名。%符号代表所有主机

GRANT CREATE, INSERT,SELECT,SHOWDATABASES,INDEX,ALTER,UPDATE ON `db_backend`.* TO backend;    //给任何主机上的backend用户赋予db_backend数据库所有表的对应权限。

方法二:直接创建并赋予权限:

Grant all privileges on *.*  to  'backend'@'%' identified by '123456' with grant option;

2、查看mysql用户权限

方法一:直接查询mysql数据库的user表;

方法二: show grants for 你的用户;  或者  show grants for root@'localhost';

3、移除一个用户的权限

revoke insert,update,delete,alter,select ON *.* from 'xbb'@'localhost' IDENTIFIED BY '123';

revoke alter on *.*  from ‘backend’@’%’;

4、删除用户

drop user username;

5、更改mysql数据库root用户密码

mysql早期版本修改root密码

UPDATE mysql.user SET Password=PASSWORD('newpwd') WHERE user='root';

在之前的版本中,密码字段的字段名是 password,5.7版本改为了 authentication_string,所以修改语句如下:

update mysql.user set authentication_string = password('test123'), password_expired = 'N', password_last_changed = now() where user = 'root';

update mysql.user set plugin="mysql_native_password" where user='root';     //该字段默认为 "auth_socket",不用密码就能登录该用户

FLUSH PRIVILEGES;

mysql8.0版本修改root密码

1:已知root密码,登录root

use mysql;
update user set plugin='caching_sha2_password' where user='root';      //该字段默认为 "auth_socket",不用密码就能登录该用户
alter user 'root'@'localhost' identified with mysql_native_password by '123456';
FLUSH PRIVILEGES;
2:忘记root密码的情况下
(1) cat /etc/mysql/debian.cnf
找到
user=debian-sys-maint
password=xxxxxxxxxx
使用该用户登录进入mysql,然后就可以按照以上步骤1操作了。

6、配置root外网访问:

1:vim /etc/mysql/mysql.conf.d/mysqld.cnf
修改以下配置:
bind-address = 0.0.0.0
2:调整root访问host

use mysql;
update user set host='%' where user='root';

重启mysql服务

service mysql restart

7、mysql8创建新用户并赋予权限

CREATE USER 'ubuntu'@'%' IDENTIFIED BY '123456';  #用户为ubuntu,密码为 123456
GRANT ALL ON test_db.* TO "ubuntu"@"%" WITH GRANT OPTION; #某个库所有权限
GRANT ALL ON *.* TO "ubuntu"@"%" WITH GRANT OPTION; #所有库所有权限
FLUSH PRIVILEGES;

五、数据的备份与恢复

1.导出

  shell:

  mysqldump -u root -p dbname > test.sql    #导出整个数据库,包括结构和数据

       mysqldump -u root -pXXXXXX --no-data dbname  tablename > table.sql     //导出表结构

  mysqldump -u root -p dbname  tablename > test.sql      //导出表结构和数据

  mysqldump -u root -p -d –add-drop-table db_name > test.sql   #导出数据库结构,-d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table

  mysql -h 127.0.0.1 -P 3306 -uroot -pXXXXXX -D dbname -e "select * from table" > /tmp/test.xls
  mysql --default-character-set=utf8 -uroot -pXXXXXX -e "select * from db.table" > /tmp/test.txt
  mysql --default-character-set=utf8 -uroot -pXXXXXX -e "select * from db.table into outfile '/tmp/test.csv' fields terminated by ',' enclosed by '\"' escaped by '\\\' lines terminated by '\n';"

  mysql客户端:

  show variables like '%secure%'; #查询数据库配置的导出目录权限是否开启,若开启则使用secure_file_priv设置的目录(如果使用其他目录会报权限问题)
  select * from db.table into outfile '/tmp/file.txt'; #导出的文件类型可为.xls,.csv,.txt等
  select * from db.table into outfile '/tmp/file.csv' character set gbk;
  select * from db.table into outfile '/tmp/file.csv' fields terminated by ',' optionally enclosed by '"' lines terminated by '\n';

2.导入

  shell:

  mysql -h127.0.0.1  -uroot -pXXXXXX < /tmp/test.sql
  mysql-ib --default-character-set=utf8 -u root -pXXXXXX -e "load data infile '/tmp/test.csv' into table $db.$table character set UTF8 fields terminated by ',' enclosed by '\"' escaped by '\\\' lines terminated by '\n';"

  mysql客户端:  

  use dbname;  source /home/pt/test.sql

  load data local infile '/tmp/data.txt' into table db.table;
  load data local infile '/tmp/data.txt' into table db.table fields terminated by ',' optionally enclosed by '"' lines terminated by '\n'
  load data local infile '/tmp/data.txt' into table db.table (col1,col2); #导入某个表的col1和col2两列的数据
  load data infile '/tmp/data.txt' into table db.table ignore 1 lines; #忽略文件头部的起始标题行

  涉及的字段说明:
  fields terminated by ',' -- 字段以逗号分隔
  optionally enclosed by '"' -- 双引号包裹字段
  lines terminated by '\n' -- 换行符为'\n'

   其他:

  因为msyql中的文件多是utf-8的编码,这个时候我们需要把utf8的编码转化为gbk的编码(从test1.xls转到test2.xls):
  iconv -c -f utf8 -t gbk test1.xls > test2.xls

3.并行压缩备份和导入

创建mydumper.sh文件:

user=root
passwd=xxxx
socket=/mydata/back/mysqld.sock
db=mydata
table_name=stock_daily
backupdir=/mydata/back/dump_$table_name
mkdir -p $backupdir

nohup echo `date +%T` && mydumper -u $user -p $passwd -S $socket  -B $db -c  -T $table_name  -o $backupdir  -t 32 -r 2000000 && echo `date +%T` &

查看备份文大小:du -sh   /mydata/back/dump_stock_daily/

复制到其他服务器保存或者测试:scp -rp /mydata/back/dump_stock_daily root@192.168.112.101:/datas

并行导入到mytest数据库:

myloader -u root -S /mydata/back/mysqld.sock -P 3306 -p xxxx -B mytest -d /mydata/back/dump_stock_daily -t 32

六、分区操作

查看分区:SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'table_name';

删除分区:ALTER TABLE table_name DROP PARTITION p_name;

FLUSH TABLE;

七、 查看表的碎片数据大小

SELECT
table_name,
CONCAT(FORMAT(SUM(data_length)/1024/1024,2),'M') AS dbdata_size,
CONCAT(FORMAT(SUM(index_length)/1024/1024,2),'M') AS dbindex_size,
CONCAT(FORMAT(SUM(data_length + index_length)/1024/1024/1024,2),'G') AS table_size,
`AVG_ROW_LENGTH`,table_rows,update_time
FROM
information_schema.tables
WHERE table_schema = 'db_name' AND table_name='table_name';

结果:

 数据表在系统中占用的空间有1.66G,说明有0.42G是碎片(大多由于删除操作造成的。也就是记录被删除了,空间没有回收)

windows下可以直接进入mysql的data保存目录找到对应表的.ibd文件,查看文件大小,例如:E:\MySQL5.7.26\data\my_data\stock_daily.ibd

linux 下同理,例如:du -sh /opt/mysql/data/mydata/stock_daily*

一般在系统中看到的文件大小于sql语句查询到的大小之差就是碎片占用的空间。

八、其他

1.Show 语句用法

show tables或show tables from database_name; -- 显示当前数据库中所有表的名称。 
2. show databases; -- 显示mysql中所有数据库的名称。 
3. show columns from table_name from database_name; 或show columns from database_name.table_name; -- 显示表中列名称。 
4. show grants for user_name; -- 显示一个用户的权限,显示结果类似于grant 命令。 
5. show index from table_name; -- 显示表的索引。 
6. show status; -- 显示一些系统特定资源的信息,例如,正在运行的线程数量。 
7. show variables; -- 显示系统变量的名称和值。 
8. show processlist; -- 显示系统中正在运行的所有进程,也就是当前正在执行的查询。大多数用户可以查看他们自己的进程,但是如果他们拥有process权限,就可以查看所有人的进程,包括密码。 
9. show table status; -- 显示当前使用或者指定的database中的每个表的信息。信息包括表类型和表的最新更新时间。 
10. show privileges; -- 显示服务器所支持的不同权限。 
11. show create database database_name; -- 显示create database 语句是否能够创建指定的数据库。 
12. show create table table_name; -- 显示创建表的语句。 
13. show engines; -- 显示安装以后可用的存储引擎和默认引擎。 
14. show innodb status; -- 显示innoDB存储引擎的状态。 
15. show logs; -- 显示BDB存储引擎的日志。 
16. show warnings; -- 显示最后一个执行的语句所产生的错误、警告和通知。 
17. show errors; -- 只显示最后一个执行语句所产生的错误。 
18. show [storage] engines; --显示安装后的可用存储引擎和默认引擎。

19.show create database db_name;   //查看数据库编码

20.show create table tab_name;    //查看数据表编码

21.show full columns from tab_name;   //查看数据表字段编码

2.Infobright相关

将MySQL数据导出csv文件:

SELECT * FROM `20170913_login` INTO OUTFILE '/mydata/csv/20170913_login.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n';

导入cs文件到Infobright中:

load data infile '/mydata/csv/20170913_login.csv' into table `login` fields terminated by ',' optionally enclosed by '"' lines terminated by '\n';

导入IB后,中文变成乱码的解决方法:

1、在IB中执行:show variables like "%char%";

mysql> show variables like "%char%";
+--------------------------+-----------------------------------------------------+
| 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 | /data/infobright-4.0.7-x86_64/share/mysql/charsets/ |
+--------------------------+-----------------------------------------------------+
8 rows in set (0.01 sec)

2、在MySQL中执行:show variables like "%char%";
mysql> show variables like "%char%";
+--------------------------+----------------------------------------------------------------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------------------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /data1/mysql_root/base/mysql_wrapper_5_6_28_20160902_tlinux_ts85/mysql/share/charsets/ |
+--------------------------+----------------------------------------------------------------------------------------+
8 rows in set (0.00 sec)

发现IB中的变量character_set_database和变量character_set_server的编码跟MySQL中的编码不一样;

在IB中执行:
SET character_set_database = utf8 ;
SET character_set_server = utf8 ;


系统变量:
– character_set_server:默认的内部操作字符集
– character_set_client:客户端来源数据使用的字符集
– character_set_connection:连接层字符集
– character_set_results:查询结果字符集
– character_set_database:当前选中数据库的默认字符集
– character_set_system:系统元数据(字段名等)字符集