mysql常用sql语句
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql常用sql语句相关的知识,希望对你有一定的参考价值。
1. mysql 管理命令 帮助? HELP
1.1查看mysql状态信息
show processlist; 查询当前连接进程
show status 查看当前会话的数据库状态信息
show global status; 查看整个数据库运行状态信息,很重要的分析并做好监控
show processlist; 查看正在执行的sql语句,
show full processlist 查看正在执行的完整sql语句,
set global key_buffer_size=32777218 不重启数据库调整参数,临时生效
show variables;查看数据库的参数信息,如my.cnf中参数是否生效
1.2修改mysql字符集为UTF-8的方法:
show variables like "%char%"
在/etc/my.cnf对应如下配置段加入相应命令
[clinet]
字段加入default-character-set=utf8 客户端生效
[mysqld]
字段加入character-set-server=utf8
[mysql]
字段里加入default-character-set=utf8 本地生效
然后重启mysql服务
查询字符集文件
show character set;
1.3解决mysql乱码的问题?
方法1:
1. 检查建表语句,判断字符集类型show create table test_t0;
2. 设置字符集set names latinl;
方法2:
导入数据的时候指定符字符
mysql -uroot -p123456 --default-character-set=latin1 discuz</backup/discuz.sql
方法3:
在my.cnf文件中加入字符集
[mysqld]
default-character-set=latinl 适合5.5以前
character-set-server=latinl 适合5.5以后
不乱码的思想,linux ,客户端,服务器端,库,表,程序都统一字符集,中英文环境尽量使用UTF8
1.4 mysql的历史命令保护
vi /root/.mysql_bistory # 创建mysql历史命令
ln -s dev/noull > mysql_history # 保户命令历史,创建成空文件
系统历史命令清除 bashrc history -c
1.5 Mysql远程管理 mysql -uroot -p -h 192.168.1.100
mysql交互式 mysql -uroot -p123456 -e “show databases;”
Mysql安全优化
删除空用户和多余用户
drop user ‘username‘@‘host‘
删除空用户
drop user ‘ ‘@‘host‘
1.6 mysql锁表
5.1版本: flush tables with read lock
5.5版本: flush table with read lock
解锁:
解锁跟系统的两个变量值有关,自动解锁时间
Wait_timeout = 28800
Interactive_timeout = 28800
1小时默认3600秒 8小时*3600秒=28800秒 24小时共86400秒
Show variables like “%timeout%”
1.7 数据库文件路径
mysql> show variables link ‘%datadir%‘;
2.Mysql的升级
官方升级网址
https://dev.mysql.com/doc/refman/5.5/en/upgrading.html
As part of the "Logical Upgrade", I had to add the --flush-privileges option when dumping because mysql didn‘t recognise the newly created users when restoring views. Additionally I added --triggers for completeness.
mysqldump --add-drop-table --routines --events --triggers --flush-privileges --all-databases --force -uroot -p > mysql_backup.sql
3. Mysql SQL语句(DDL DML DCL 语言)
**SQL语句常见的分类**
DDL 数据定义语言(CREATE ALTER DROP)
DML 数据操作语言(SELECT INSTER DELETE UPDATE)
DCL 数据控制语言(GRANT REVOKE COMMIT ROLLBACK)
结构化查询语言(Structured Query Language)简称SQL(发音:/?es kju? ?el/ "S-Q-L"),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
一:数据查询语言(DQL:Data Query Language):
其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。
二:数据操作语言(DML:Data Manipulation Language):
其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。
三:事务处理语言(TPL):
它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。
四:数据控制语言(DCL):
它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。
五:数据定义语言(DDL):
其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP TABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。
六:指针控制语言(CCL):
它的语句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作
mysql 的system命令
在命令行下,可以通过执行system命令,调用bash环境,比如
system ls /data/ 查看data目录下的文件
3.1 Mysql 数据库管理
select查询命令 select *();
查看当前库
mysql> select database();
查看当前用户
mysql> select user();
查看当前时间
mysql> select now();
8.6.2.2 切换当前库 use databases;
mysql> use mysql;
创建数据库 Create Databas
create Database Discuz character set utf8
create database if not exists db_name 如果不存在就创建,不报错
# 查询数据库创建的历史命令
show create database discus;
查询字符集文件
show character set;
# 创建数据库并指定字符集
create database discuz default character set gbk collate gbk_chinese_ci;
create database discuz default character set utf8 collate utf8_general_ci;
数据库重命名
RENAME database olddbname TO newdbname
查看数据库 Show Databases
show databases;
show databases like ‘my%’;
查询数据库创建的历史命令
show create database discus;
删除数据库 Drop Database
drop datebase [if exists] db_name;
注:删除无法恢复
Drop database bbs; # 删除bbs数据库
3.2 Mysql 数据表操作
创建表:Create table tb_name (字段名 数据类型)
mysql> create table tutorials_tbl(
-> tutorial_id INT NOT NULL AUTO_INCREMENT,
-> tutorial_title VARCHAR(100) NOT NULL,
-> tutorial_author VARCHAR(40) NOT NULL,
-> submission_date DATE,
-> PRIMARY KEY ( tutorial_id )
-> );
+-----------------+--------------+------+-------+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+--------+------------+----------------+
| torial_id | int(11) | NO | PRI | NULL | auto_increment |
| tutorial_title | varchar(100) | NO | | NULL | |
| tutorial_author | varchar(40) | NO | | NULL | |
| submission_date | date | YES | | NULL | |
设置主键:
create table passwd2 (
id int(10) auto_increment PRIMARY KEY,
name char(20),
sex char(20)
);
例:create table students(name char(20) null,age char(10) null,sex char(10) null);
insert into students values(‘zhonglaing‘,‘23‘,‘man‘);
*************************
查询表的建表语句
show create table studentG;
*************************
G
send command to mysql server ,display result vertically 发送命令到mysql server,垂直显示结果
生产创建表语句
CREATE TABLE `subject_comment_manager` (
`subject_comment_manager_id` bigint(12) NOT NULL auto_increment COMMENT ‘主键‘,
`subject_type` tinyint(2) NOT NULL COMMENT ‘素材类型‘,
`subject_primary_key` varchar(255) NOT NULL COMMENT ‘索材的主键‘,
`subject_title` varchar(255) NOT NULL COMMENT ‘索材的名称‘,
`edit_user_nick` varchar(64) default NULL COMMENT ‘修改人‘,
`edit_user_time` timestamp NULL default NULL COMMENT ‘修改的时间‘,
`edit_comment` varchar(255) default NULL COMMENT ‘修改的理由‘,
`state` tinyint(1) NOT NULL default ‘1‘ COMMENT ‘0代表关闭,1代表正常‘,
PRIMARY KEY (`subject_comment_manager_id`),
KEY `IDX_PRIMARYKEY`(`subject_primary_key`(32)),
KEY `IDX_SUBJECT_TITLE` (`subject_title`(32)),
KEY `index_nick_type` (`edit_user_nick`(32),`subject_type`)
);
查看表: show tables
查看库中的表: show tables;
查年表中的结构: desc tabale_name;
删除表: Drop table tb_name
drop table [if exists] tb_name;
drop table bbs; # 删除bbs表
修改表:Alter table tb_name [ add|change|modify ]
alter table tb_name;
修改 modify 改属性 改数据类型
改变 change 改值 改名称
增加 add
删除 drop
增加:add
语法格式: alter table students add 字段名varchar(100) # 添加字段名 指定数据类型varchar
实例: alter talbe students add telphone int(20); # 增加telphone列,
alter talbe students add telphone int(20) first ; # 在第1列增加telphone列,
alter talbe students add telphone int(20) after name ; # 在name列后增加telphone列,
修改值:change
例: alter table students change “原字段1“ ”现字段2“ varchar(100) after name;
修改”原字段1”的字段名和类型,添加到Nmae字符之后
要指定源字段,新字段,新类型
alter table user change age ages varchar(100);
修改属性:modify
例: alter table users modify tel text(10);
修改tel字段的字段类型
删除列: drop
例:alter table user drop id;
删除user表中的id列
清空表:delete from tables | truncate table
delete 是逻辑删除,一行一行删
truncate 物理删除,清空物理文件
清空表的内容
delect from jf_t1;
清空表的内容
truncate table user;
制一张表 create tables tb_name select from tb_name
复制一张表和数据:
create table new_table select from old_table;
复制一张表不复制数据
create table new_table select * from old_table where 0 ;
只复制表结构到新表
CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2
或者
CREATE TABLE 新表 LIKE 旧表
复制表结构及数据到新表
CREATE TABLE 新表 SELECT * FROM 旧表
复制旧表的数据到新表(假设两个表结构一样)
INSERT INTO 新表 SELECT * FROM 旧表
复制旧表的数据到新表(假设两个表结构不一样)
INSERT INTO 新表(字段1,字段2,.......) SELECT 字段1,字段2,...... FROM 旧表
重命名表 rename table
Rename TABLE tb_name TO new_tb_name
? alter table rename tb_name to new_table 重命名表
表结构 desc table
mysql> desc mysql.user;
-----------------------+-----------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Password | char(41) | NO | | | |
| Select_priv | enum(‘N‘,‘Y‘) | NO | | N | |
3.3 Mysql 数据管理
插入数据:Insert into tb_name … values …
? 指定字段插入:
insert into tb_name (col1,col2,...)values (‘string‘,num,...);
插入数据 (字段名) VALUES值 (‘字符串’, 数值1-9)
字符串要单引 数值不需要
单行插入
例: insert into tb_name (id,name)values (‘1’,’zhongliang’)
可同时插入多行数据
多行插入
例: insert into student (name,sex) value (‘zhongliang‘.‘man’)(‘xiaoliang’,‘woman‘);
插入前先查询表的结果DESC tb_name 看哪些是必须插入值的
# 未指定的字段代表是允许为null的,可以不在字段位写,按顺序写上不允许为空的字段
不指定字段插入
不指定字段插入,代表全部都插入值
name age sex telnet
例:insert into students values (‘zhongliang‘,20,‘m‘,249765270);
语句插入1000条
create database hd;
create table techer (name char(20),tel char(20));
for i in `seq 10000`;do mysql -e "use hd;insert into techer (name,tel) values (‘zhonglaing‘,‘123456789‘)";done
查询内容:select * from table;
where条件:and or < >
order排序:
order by id asc # 按id正序排序
order by id desc # 按id倒序排序
显示表的所有字段
describe user;
select 字段 frome tb_name where 条件1 [and | or] 条件2
select count(*) from user; 统计多少行
select * from user limit 10; 看10行 # 在生产环境中不要查所有,应为当上千条数据时会卡死
select * from user where 列名>30; # 查询某列的值大于30的
select * from user where 列名 like ‘%abc%’; # 查询某列的值包含匹配abc字符的所有内容
显示user表的第一行内容
select * from user limit 1;
select * from user limit 1,3; # 查看第1行第3行内容
select * from user where name="" limit 10G;
select name from user where nam="";
内容匹配查询
select * from user name link "%zhong%";
select * from user name link "%zhong%" and name=xxx ;
排列显示,
select * from user where User=‘root‘ G;
多表查询
select 表1.列1 , 表2.列2 , 表3.列3 from 表1,表2,表3 where 条件1 and 条件2
select user.id,student.name,address.tel from user,student,address where
修改数据:Update tb_name Set
update tb_name set 列名=“新值” where 列名=“value”; # id
例:update student set tel=249765270 where name=zhongliang;
# 修改zhongliang用户的tel电话
update mysql.user set host=‘localhost‘ where host=‘127.0.0.1‘ and user=‘root‘
删除数据:Delete From tb_name where
delete from tb_name where id=‘value‘;
例:delete form student where tel=249765270
3.4Mysql 数据库备份还原
Xtranbackup 开源物理备份工具
备份分为逻辑备份和物理备份
逻辑备份:通过mysqldump备份过去
物理备份:通过将mysql目录的数据库文件拷贝过去
Mysqldump参数:
-A 备份所有库
-B 备份多个库 此参数使用后,自带create database语句,在恢复时,可以事先不建数据库就可忧复 如:mysqldump -uroot -p123456 </tmp/backup.sql
-x 锁表
-l 只读锁表
-C 压缩传输
--compact 去掉注释输出 用于调试
-d 备份表结构
-F 备份数据库时,切割blog日志,目的是防止备份数据与binlog重复,备份时记住binlog日志文件序号
--master-data=1 自动查找binlog日志位置节点 不需要手动入切割blog日志 与-F二选一
=1 ; 在binlog中添加一条不带注释的change master的post节点和binlog文件名,用于在slave上导入时,能自动记录post点和binlog文件位置,用于同步之后的binlog文件
=2: 在binlog中添加一条带注释的change master的post节点和binlog文件名
Mysql 全量备份与增量备份
全量备份:
全量部份就是将数据库完整备份,mysql -uroot -p -A -B >/backup/mysql.sql
innodb 引擎备份:
mysqldump -uroot -p --default-character-set=gbk --single-transaction -F -B discuz | gzip >/databackup/mysql.sql.gz
innodb 引擎备份:
mysqldump -uroot -p --default-character-set=gbk --lock-all-tables -F -B discuz | gzip >/databackup/mysql.sql.gz
企业场景全量和增量的频率是怎么做的呢?
- 中小公司,全量一般是每天一次,业务流量低谷执行全备,备份时要锁表
- 单台数据库,如何增量,用rsync(配合定时任务)把bin-log推送到远端备份服务器上
例:rsync -avz mysql-bin* [email protected]::backup --password-file=/etc/rsync.passwd - 大公司周备,每周六00点一次全备,下周日-下周六00点前都是增量
-
一主多从,会有一个从库做备份,延迟同步
mysql的备份什么场景下使用?
- 迁移或升级数据库的时候
- 添加从库
- 主库勿删除时,需要备份还原
-
跨机房灾备,需要备份
增量恢复全过程(针对前端可以暂停写入)
- 先对数据库进行锁表,防止新数据写入
- 找到全备和增备文件
grep -i "change" /backup/mysql.sql 找到全备最后的binlog的pos点位置,根据位置,找到增量的binlog日志文件 - 如果前端不能锁主库,这时要马上刷新binlog mysqladmin -uroot -p flush-logs 生成新的Binlog文件,这样可以判
断之后插入的数据会生成在新的binlog日志文件中 - 将需要增量恢复的binlog日志文件移动到新的目录,以防二次损坏
- 执行mysqlbinlog mysql-bin.0000014 >/databackup/binlog14.sql 将binlog日志生成sql语句
-
vi /databackup/binlog14.sql 将勿操作语句删除,比如drop database之类的
增量恢复全过程(针对前端不可以暂停写入) 不停库不推荐
- 立即断开从的sql_threed线程,防止从读取relay-log日志,
- 将主mysql的binlog进行分割 -F
- 将主mysql的最新全部和出故障前的binlog日志进行恢复到从(前提要把日志中出问题的语句先删除)
- 然后将从提升为主mysql
- 将原主mysql被切割的后面用户写入的新数据的binlog日志恢复到现新的主mysql库
-
缺点:可能导致后期写入的数据不能插入,因为在你恢复的时候,有人又写入数据,导致主键冲突
最好的方案就是,在恢复最后写入数据时,暂停最短时间导入新数据。
生产场景2:
为了防止数据被勿删除,有些公司针对主从同步设置了某一台mysql从廷迟同步30-60分钟,这样做的目的是为了防止主数据库被执行勿删除时,从能保证数据完整并通过把主binlog增量部份的日志恢复到此从上,接替主的位置。
生产场影mysql数据恢复思路?
表重要的前题下:
- 停服务,挂维护页面 防止前端写入数据,保证数据一致性。
- 同时对故障的数据做一次备份,以防万一
- 恢复内存全量备份 根据post点位置,将相应的binlog日志恢复
-
启动测试
Mysql备份数据库
? 备份所有数据库 mysqldump -uroot -p -B -A --events > all.sql # 备份服务器中所有的库 ? 备份mysql 使用root用户,密码123456 备份到/tmp/ mysqldump -uroot -p123456 -B mysql > /tmp/mysql2016.sql ? 数据库压缩备份 mysqldump -uroot -p123456 discuz | gzip > backupfile.sql.gz 解压:gzip -d backupfile.sql.gz ? 同时备份多个MySQL数据库 mysqldump -uroot -p123456 -B databasename1 databasename2 databasename3 > multibackupfile.sql ? 仅仅备份数据库结构 mysqldump –no-data –databases databasename1 databasename2 databasename3 > structurebackupfile.sql ? 跨主机备份 使用下面的命令可以将host1上的sourceDb复制到host2的targetDb,前提是host2主机上已经创建targetDb数据库: mysqldump -uroot -p sourceDb | mysql –uroot –p --host=192.168.1.100 -C targetDb -C指示主机间的数据传输使用数据压缩 目标主机必须gran授权允许源主机连接 mysqldump: Got error: 1016: Can‘t open file: ‘./BBS/pre_home_feed.frm‘ (errno: 24) when using LOCK TABLES mysqldump -uroot -p123456 BBS --lock-tables=false > /data/bbs.sql mysqldump -uroot -p123456 -A -B --events --master-data=2 -x > /backup/all.mysql 企业常规备份 myisam mysqldump -uroot -p123456 -A -B --master-data=2 -x dicuz|gzip >/backup/all.sql.gz 企业常规备份 inodb mysqldump -uroot -p123456 -A -B --master-data=2 -x --single-transaction dicuz|gzip >/backup/all.sql.gz for myisam mysqldump --user=root --all-databases --flush-privileges --lock-all-tables --master-data=1 --flush-logs --triggers --routines --envents --hex-blob >/data/mysqlall.sql for innodb mysqldump --user=root --all-databases --flush-privileges --single-transaction --master-data=1 --flush-logs --triggers --routines --envents --hex-blob>/data/mysqlall.sql
Mysql基于slave备份数据
使用tar,copy,rsync来备份 在slave的my.cnf增加log-slave-updates配置,使slave也产生binlog日志文件
Mysql恢复数据库
注意: mysql在恢复数据库的时候,最好像原数据库清除重新初始化,并重新change master,记得要重启数据库同步才会生效,恢复库 mysql> mysql –uroot zhongliang < /tmp/zhongliang.sql; 恢复数据库 先创建数据库名,再恢复 还原压缩的MySQL数据库 gunzip < backupfile.sql.gz | mysql -uusername -ppassword databasename
waiting to finalize termination
线程停止时发生的一个很简单的状态
以上是关于mysql常用sql语句的主要内容,如果未能解决你的问题,请参考以下文章