登录mysql
mysql -urot -p 单实例 mysql -uroot -p -S /data/3306/mysql.sock 多实例MySQL帮助命令helpmysql> helpFor information about MySQL products and services, visit: For developer information, including the MySQL Reference Manual, visit: To buy MySQL Enterprise support, training, or other products, visit: List of all MySQL commands:Note that all text commands must be first on line and end with ';'? (\?) Synonym for `help'.clear (\c) Clear the current input statement.connect (\r) Reconnect to the server. Optional arguments are db and host.delimiter (\d) Set statement delimiter.edit (\e) Edit command with $EDITOR.ego (\G) Send command to mysql server, display result vertically.exit (\q) Exit mysql. Same as quit.go (\g) Send command to mysql server.help (\h) Display this help. mysql> show databases like "my%";+----------------+| Database (my%) |+----------------+| mysql |+----------------+1 row in set (0.00 sec)mysql> show grants for ; +---------------------------------------------------------------------+| Grants for |+---------------------------------------------------------------------+| GRANT ALL PRIVILEGES ON *.* TO WITH GRANT OPTION || GRANT PROXY ON TO WITH GRANT OPTION |+---------------------------------------------------------------------+2 rows in set (0.00 sec) mysql> grant all privileges on *.* to identified by '123456' with grant option;增加system用户,并提升为超级管理员,即和root等价的用户,只是名称不同mysql> delete from mysql.user; 删除所有mysql中的用户为root账户设置密码方法[root@centos02 tools]# mysqladmin -uroot password '123456' 没有密码的用户设置密码命令[root@centos02 tools]# mysqladmin -uroot -p'123456' password '654321' -S /data/3306/mysql.sock 适合多实例修改管理员root密码方法1[root@centos02 tools]# mysqladmin -uroot -p'123456' password 'martin'[root@centos02 tools]# mysqladmin -uroot -p'654321' password 'martin' -S /data/3306/mysql.sock 适合多实例修改管理员root密码方法2mysql> update mysql.user set password=password('martin') where user='root'; mysql> flush privileges;第一个password代表要修改的字段 第二个password代表是一个函数此方法适合密码丢失后通过 --skip-grant-tables参数启动数据库后修改密码mysql> select user,host,password from mysql.user;+--------+-----------+-------------------------------------------+| user | host | password |+--------+-----------+-------------------------------------------+| root | localhost | || root | centos02 | || root | 127.0.0.1 | || root | ::1 | || | localhost | || | centos02 | || system | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |+--------+-----------+-------------------------------------------+mysql> update mysql.user set password=password('martin') where user='system'; Query OK, 1 row affected (0.14 sec)Rows matched: 1 Changed: 1 Warnings: 0mysql> flush privileges;Query OK, 0 rows affected (0.05 sec)mysql> quitBye[root@centos02 tools]# mysql -usystem -pmartinWelcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 6Server version: 5.5.49 MySQL Community Server (GPL) Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> 找回丢失的mysql密码1、先停止数据库[root@centos02 tools]# /etc/init.d/mysqld stop2、使用 --skip-grant-tables 启动mysql,忽略授权登录验证[root@centos02 tools]# /application/mysql/bin/mysqld_safe --skip-grant-tables --user=mysql &[root@centos02 tools]# mysql -uroot -p 登录时空密码 mysql> update mysql.user set password=password('123456') where user='root' and host='localhost'; #修改密码为123456 Query OK, 0 rows affected (0.06 sec)Rows matched: 1 Changed: 0 Warnings: mysql> flush privileges;Query OK, 0 rows affected (0.11 sec)[root@centos02 tools]# mysqladmin -uroot -p123456 shutdown 优雅的关闭数据库160802 13:01:47 mysqld_safe mysqld from pid file /application/mysql/data/centos02.pid ended[1]+ Done /application/mysql/bin/mysqld_safe --skip-grant-tables --user=mysql[root@centos02 tools]# [root@centos02 tools]# /etc/init.d/mysqld start Starting MySQL.. [ OK ][root@centos02 tools]# mysql -uroot -p123456Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 1Server version: 5.5.49 MySQL Community Server (GPL)Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> 多实例找回丢失的密码killall mysqldmysqld_safe --defaults-file=/data/3306/my.cnf --skip-grant-tables &mysql -uroot -p -S /data/3306/mysql.sock 登录时空密码mysql> update mysql.user set password=password('123456') where user='root' and host='localhost'; #修改密码为123456 mysql> flush privileges; killall mysqld/data/3306/mysql start 1、创建数据库mysql> create database martin;Query OK, 1 row affected (0.05 sec)mysql> show create database martin\G;*************************** 1. row *************************** Database: martinCreate Database: CREATE DATABASE `martin` /*!40100 DEFAULT CHARACTER SET latin1 */1 row in set (0.00 sec)mysql> create database martin_gbk DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; #gbk 代表字符集 gbk_chinese_ci代表校对规则Query OK, 1 row affected (0.00 sec)mysql> show create database martin_gbk\G; *************************** 1. row *************************** Database: martin_gbkCreate Database: CREATE DATABASE `martin_gbk` /*!40100 DEFAULT CHARACTER SET gbk */1 row in set (0.00 sec)mysql> create database martin_utf8 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; #utf8 编码,字符集的不一致时数据库乱码的罪魁祸首Query OK, 1 row affected (0.00 sec)mysql> show create database martin_utf8\G; *************************** 1. row *************************** Database: martin_utf8Create Database: CREATE DATABASE `martin_utf8` /*!40100 DEFAULT CHARACTER SET utf8 */1 row in set (0.00 sec)编译时候指定了特定的字符集,则以后创建的数据库就不需要指定字符集了企业环境怎么创建数据库1、根据开发的程序确定字符集 建议utf82、编译时候指定字符集3、然后建库的时候默认创建即可显示数据库mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || martin || martin_gbk || martin_utf8 || mysql || performance_schema || test |+--------------------+7 rows in set (0.21 sec)mysql> show databases like 'mar%'; +-----------------+| Database (mar%) |+-----------------+| martin || martin_gbk || martin_utf8 |+-----------------+3 rows in set (0.00 sec)删除数据库mysql> drop database martin;Query OK, 0 rows affected (0.27 sec)连接数据库mysql> use mysql;Database changed查看当前连接的数据库mysql> select database();+------------+| database() |+------------+| mysql |+------------+1 row in set (0.00 sec)查看当前的用户mysql> select user();+----------------+| user() |+----------------+| |+----------------+1 row in set (0.00 sec)查看当前数据库包含的表信息mysql> show tables;+---------------------------+| Tables_in_mysql |+---------------------------+| columns_priv || db || event || func || general_log || help_category || help_keyword || help_relation || help_topic || host || ndb_binlog_index || plugin || proc || procs_priv || proxies_priv || servers || slow_log || tables_priv || time_zone || time_zone_leap_second || time_zone_name || time_zone_transition || time_zone_transition_type || user |+---------------------------+24 rows in set (0.03 sec)删除用户语法: drop user 主机名'mysql> select user,host from mysql.user; +--------+-----------+| user | host |+--------+-----------+| root | 127.0.0.1 || root | ::1 || root | centos02 || root | localhost || system | localhost |+--------+-----------+5 rows in set (0.00 sec)mysql> drop user ; Query OK, 0 rows affected (0.05 sec)mysql> select user,host from mysql.user;+--------+-----------+| user | host |+--------+-----------+| root | 127.0.0.1 || root | centos02 || root | localhost || system | localhost |+--------+-----------+4 rows in set (0.00 sec)创建mysql用户及赋予用户权限mysql> grant all on martin.* to identified by '123456'; #在创建用户时候同时进行授权Query OK, 0 rows affected (0.05 sec) mysql> select user,host from mysql.user; +--------+-----------+| user | host |+--------+-----------+| root | 127.0.0.1 || root | centos02 || root | localhost || system | localhost || zabbix | localhost |+--------+-----------+5 rows in set (0.00 sec)mysql> show grants for ;+---------------------------------------------------------------------------------------------------------------+| Grants for |+---------------------------------------------------------------------------------------------------------------+| GRANT USAGE ON *.* TO IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' || GRANT ALL PRIVILEGES ON `martin`.* TO |+---------------------------------------------------------------------------------------------------------------+2 rows in set (0.00 sec)mysql> grant all on martin.* to identified by '123456'; #在创建用户时候同时进行授权等同于下面两句话mysql> create user identified by '123456'; 创建用户及设置用户密码grant all on zabbix.* ; 授权mysql> create user identified by '123456'; 创建用户不进行授权,默认是USAGE 权限Query OK, 0 rows affected (0.00 sec) mysql> mysql> show grants for ;+------------------------------------------------------------------------------------------------------------------+| Grants for |+------------------------------------------------------------------------------------------------------------------+| GRANT USAGE ON *.* TO IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |+------------------------------------------------------------------------------------------------------------------+1 row in set (0.00 sec) 授权局域网内主机远程连接数据库mysql> grant all on martin.* to identified by '123456';通过实验获得 all privilege 到底有哪些权限mysql> show grants for ;+---------------------------------------------------------------------------------------------------------------+| Grants for |+---------------------------------------------------------------------------------------------------------------+| GRANT USAGE ON *.* TO IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' || GRANT ALL PRIVILEGES ON `martin`.* TO |+---------------------------------------------------------------------------------------------------------------+2 rows in set (0.00 sec)mysql> revoke insert on martin.* from ; #回收insert权限Query OK, 0 rows affected (0.01 sec)mysql> show grants for ; +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Grants for |+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| GRANT USAGE ON *.* TO IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' || GRANT SELECT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `martin`.* TO |+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+2 rows in set (0.00 sec) 可以看到剩下的权限有SELECT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTECREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGERmysql> select * from mysql.user\G;*************************** 1. row *************************** Host: localhost User: root Password: *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 Select_priv: Y Insert_priv: Y Update_priv: Y Delete_priv: Y Create_priv: Y Drop_priv: Y Reload_priv: Y 企业生产环境如何授权用户权限1、博客 cms等产品的数据库授权:对于web连接用户授权尽量采用最小化原则,很多开源软件都是web界面安装,因此在安全期间除了select insert update delete 4个权限外,还需要create drop 等比较危险的权限mysql> grant select,insert,update,delete,create,drop on blog.* to identified by '123456';2、生成数据库表后,要回收create drop授权revoke create on blog.* from blog @'172.16.80.%';revoke drop on blog.* from blog @'172.16.80.%'; 创建表语法create table 表名 (字段名1 类型1,字段名n,类型n);mysql> create table student(id int(4) not null,name char(20) not null, age tinyint(20) not null default 0,dept varchar(16) default null);Query OK, 0 rows affected (0.21 sec)查看建表的结构mysql> desc student;+-------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id | int(4) | NO | | NULL | || name | char(20) | NO | | NULL | || age | tinyint(20) | NO | | 0 | || dept | varchar(16) | YES | | NULL | |+-------+-------------+------+-----+---------+-------+4 rows in set (0.03 sec)查看已建表的语句mysql> show create table student \G;*************************** 1. row *************************** Table: studentCreate Table: CREATE TABLE `student` ( `id` int(4) NOT NULL, `name` char(20) NOT NULL, `age` tinyint(20) NOT NULL DEFAULT '0', `dept` varchar(16) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin11 row in set (0.03 sec) 为表的字段创建索引索引就像书的目录一样,如果在字段上建立了索引,那么以索引列为查询条件时可以加快查询速度,这是mysql优化的重要内容之一 建立主键索引mysql> create table student1(id int(4) not null AUTO_INCREMENT,name char(20) not null, age tinyint(20) not null default 0,dept varchar(16) default null,primary key(id),key index_name(name)); primary key(id) 表示主键key index_name(name) name字段普通索引mysql> desc student1;+-------+-------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+----------------+| id | int(4) | NO | PRI | NULL | auto_increment || name | char(20) | NO | MUL | NULL | || age | tinyint(20) | NO | | 0 | || dept | varchar(16) | YES | | NULL | |+-------+-------------+------+-----+---------+----------------+4 rows in set (0.00 sec)利用alter命令修改id列为自增主键列 (一般在建表的时候就该创建主键,所以一般不这样使用)mysql> desc student; +-------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id | int(4) | NO | | NULL | || name | char(20) | NO | | NULL | || age | tinyint(20) | NO | | 0 | || dept | varchar(16) | YES | | NULL | |+-------+-------------+------+-----+---------+-------+4 rows in set (0.00 sec) mysql> mysql> mysql> alter table student change id id int primary key auto_increment;Query OK, 0 rows affected (0.22 sec)Records: 0 Duplicates: 0 Warnings: 0 mysql> desc student;+-------+-------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+----------------+| id | int(11) | NO | PRI | NULL | auto_increment || name | char(20) | NO | | NULL | || age | tinyint(20) | NO | | 0 | || dept | varchar(16) | YES | | NULL | |+-------+-------------+------+-----+---------+----------------+4 rows in set (0.00 sec) 增加索引mysql> alter table student add index index_name(name);Query OK, 0 rows affected (1.63 sec)Records: 0 Duplicates: 0 Warnings: 0 mysql> desc student;+-------+-------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+----------------+| id | int(11) | NO | PRI | NULL | auto_increment || name | char(20) | NO | MUL | NULL | || age | tinyint(20) | NO | | 0 | || dept | varchar(16) | YES | | NULL | |+-------+-------------+------+-----+---------+----------------+4 rows in set (0.00 sec) 删除索引mysql> alter table student drop index index_name; Query OK, 0 rows affected (0.06 sec)Records: 0 Duplicates: 0 Warnings: 0 mysql> desc student;+-------+-------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+----------------+| id | int(11) | NO | PRI | NULL | auto_increment || name | char(20) | NO | | NULL | || age | tinyint(20) | NO | | 0 | || dept | varchar(16) | YES | | NULL | |+-------+-------------+------+-----+---------+----------------+4 rows in set (0.00 sec) 问题1:既然索引可以加快查询速度,那么给所有的列建索引吧?解答:因为索引不但占用系统空间,更新数据库时还需要维护索引数据的,因此,索引是一把双刃剑,并不是越多越好问题2:需要在哪些列上创建索引?解答:select user,host from mysql.user where host=... 索引一定要创建在where后的条件列上,而不是select后的选择数据的列