时间:2021-07-01 10:21:17 帮助过:15人阅读
注意到安装成功后的提示里有一些有用的信息:
==> Caveats We‘ve installed your MySQL database without a root password. To secure it run: mysql_secure_installation MySQL is configured to only allow connections from localhost by default To connect run: mysql -uroot To have launchd start mysql now and restart at login: brew services start mysql Or, if you don‘t want/need a background service you can just run: mysql.server start ==> Analytics install: 61,745 (30 days), 203,280 (90 days), 869,736 (365 days) install_on_request: 58,156 (30 days), 187,881 (90 days), 795,173 (365 days) build_error: 0 (30 days)
mysql_secure_installation
来设置mysql -uroot
brew services start mysql
第一件事我们需要启动 MySQL 服务,
$ brew services start mysql
另外,停止及重启的命令为:
brew services stop mysql
brew services restart mysql
$ brew uninstall mysql
该命令并没有彻底卸载 MySQL,比如设置过的 root 密码,MySQL 相关的配置都还保留。如需彻底卸载,可参考这里 以及这里。
通过官方文档可查阅教程及其他相关知识点,比如安全,优化。
初始可从这个上手教程开始。
默认安装下,MySQL 提供了 root 账户且不需要密码,所以可通过如下命令在本地快速连接,
$ mysql -uroot
不过还是让我们先为其设置一个密码,操作起来比较规范也更接近于真实生产环境。运行 mysql_secure_installation
后根据向导来为 root 设置密码,同时跟着向导走还能完善一些安全相关的设置。
$ mysql_secure_installation
设置好之后来看如何连接到 MySQL 服务。连接 MySQL 的命令为:
$ mysql -h host -u user -p
其中,
-h
指定 host-u
指定用户名-p
指定密码设置密码后便不能再缺省密码登录了,
$ mysql -uroot ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: NO)
需要带上 -u
,-p
指定用户名及密码。
$ mysql -h localhost -u root -p Enter password:
本机的数据库可省略掉 host 的指定,即 mysql -u root -p
。
成功登录后可看到欢迎信息:
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 25 Server version: 8.0.15 Homebrew Copyright (c) 2000, 2019, 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 的命令行,可以和数据库进行交互了,比如重置刚才设置的 root 密码:
mysql> ALTER USER ‘root‘@‘localhost‘ IDENTIFIED BY ‘new_password‘;
输入 help
或 ?
查看帮助。
mysql> help;
执行 exit
或 quit
可退出登录,即退出 MySQL 命令行。
一些注意点:
;
)或 \g
,\G
结束,如果没有显式输入结束符,回车后会进入多行输入的模式。而 MySQL 命令则不需要显式地结束,比如 help
。help
, quit
, 或 clear
)及 SQL 语句(e.g. SELECT
, CREATE TABLE
, 或 INSERT
)等是大小写不敏感的,但一般我们都将 SQL 语句中关键字大写。以下是通过 MySQL 命令行对数据库的一些基本操作。
通过 SHOW DATABASES
语句可查看当前存在的数据库。
mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.04 sec)
虽然 MySQL 文档里有说其自带了一个名为 test
的库方便测试,但这里并没发现,可能跟安装的版本及来源有关。
通过 CREATE DATABASE
语句来创建数据库。
CREATE DATABASE <database_name>
比如,创建名为 pets
的数据库,
mysql> CREATE DATABASE pets; Query OK, 1 row affected (0.09 sec)
然后通过 SHOW DATABASES
查看检查刚刚创建的 pets
数据库是否生效。
mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | pets | | sys | +--------------------+ 5 rows in set (0.00 sec)
相应地,删除数据库的命令为 DROP DATABASE <database_name>
首先通过 USE
命令切到目标数据库,该命令表示后续 SQL 语句都作用于所切换到的那个数据库。
mysql> USE pets;
通过 SELECT DATABASE()
可查看当前使用的是哪个数据库。
mysql> SELECT DATABASE(); +------------+ | DATABASE() | +------------+ | pets | +------------+ 1 row in set (0.00 sec)
通过 CREATE TABLE
语句在数据库中创建表。
以下语句会在数据库中创建一张名为 cats
表。
CREATE TABLE cats ( id INT unsigned NOT NULL AUTO_INCREMENT, # Unique ID for the record name VARCHAR(150) NOT NULL, # Name of the cat owner VARCHAR(150) NOT NULL, # Owner of the cat birth DATE NOT NULL, # Birthday of the cat PRIMARY KEY (id) # Make the id the primary key );
其中第一列为列名,紧随其后的是该列的数据类型,然后是指定其是否可空。id
列通过指定 AUTO_INCREMENT
使其在新增条目时自动增加。通过 PRIMARY KEY
设置 id
列作为表的主键。其中 #
号后面为注释内容。
通过 SHOW TABLES
可查看到刚刚创建的 cats
表。
mysql> SHOW TABLES; +----------------+ | Tables_in_pets | +----------------+ | cats | +----------------+ 1 row in set (0.01 sec)
通过 DESCRIBE
可查看各列的详情。
mysql> DESCRIBE cats; +-------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(150) | NO | | NULL | | | owner | varchar(150) | NO | | NULL | | | birth | date | NO | | NULL | | +-------+------------------+------+-----+---------+----------------+ 4 rows in set (0.00 sec)
通过 INSERT...VALUES
可向表中插入记录。
INSERT INTO cats ( name, owner, birth) VALUES ( ‘Sandy‘, ‘Lennon‘, ‘2015-01-03‘ ), ( ‘Cookie‘, ‘Casey‘, ‘2013-11-13‘ ), ( ‘Charlie‘, ‘River‘, ‘2016-05-21‘ );
关于各数据类型及相应值的设置可参见 Literal Values。
通过 SELECT
语句可查询表中的记录。这应该是使用最为频繁的语句了。
简单情况下的使用格式为 SELECT <column_name> from <table_name>
,表示从 table_name
查询 column_name
这一列的数据,可通过将列名指定为通配符 *
以表示查询所有列。
mysql> SELECT * FROM cats; +----+---------+--------+------------+ | id | name | owner | birth | +----+---------+--------+------------+ | 1 | Sandy | Lennon | 2015-01-03 | | 2 | Cookie | Casey | 2013-11-13 | | 3 | Charlie | River | 2016-05-21 | +----+---------+--------+------------+ 3 rows in set (0.01 sec)
前面提到过语句的结束除了通过分号,还有 \g
,以及 \G
。前面两者等效,\G
会将结果竖向展示。
mysql> select * from cats\G *************************** 1. row *************************** id: 1 name: Sandy owner: Lennon birth: 2015-01-03 *************************** 2. row *************************** id: 2 name: Cookie owner: Casey birth: 2013-11-13 *************************** 3. row *************************** id: 3 name: Charlie owner: River birth: 2016-05-21 3 rows in set (0.00 sec)
通过添加 WHERE
条件可对查询进行更加精确的限制,比如只返回满足某个条件下的记录。
mysql> SELECT name FROM cats WHERE owner = ‘Casey‘; +--------+ | name | +--------+ | Cookie | +--------+ 1 row in set (0.00 sec)
通过 DELETE
语句可删除表中的记录。
mysql> DELETE FROM cats WHERE name=‘Cookie‘; Query OK, 1 row affected (0.00 sec) mysql> SELECT * FROM cats; +----+---------+--------+------------+ | id | name | owner | birth | +----+---------+--------+------------+ | 1 | Sandy | Lennon | 2015-01-03 | | 3 | Charlie | River | 2016-05-21 | +----+---------+--------+------------+ 2 rows in set (0.00 sec)
通过 ALTER TABLE...ADD
语句可对表进行列的增加。
mysql> ALTER TABLE cats ADD gender CHAR(1) AFTER name; Query OK, 0 rows affected (0.22 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESCRIBE cats; +--------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(150) | NO | | NULL | | | gender | char(1) | YES | | NULL | | | owner | varchar(150) | NO | | NULL | | | birth | date | NO | | NULL | | +--------+------------------+------+-----+---------+----------------+ 5 rows in set (0.01 sec)
前面通过 DESCRIBE
语句检查表的创建情况,还可通过 SHOW CREATE TABLE
以获得关于表更加具体的信息,该语句打印用于创建该表时的 CREATE TABLE
语句,包含了我们在手写时省略掉的一些默认设置。
mysql> SHOW CREATE TABLE cats\G *************************** 1. row *************************** Table: cats Create Table: CREATE TABLE `cats` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(150) COLLATE utf8mb4_general_ci NOT NULL, `gender` char(1) COLLATE utf8mb4_general_ci DEFAULT NULL, `owner` varchar(150) COLLATE utf8mb4_general_ci NOT NULL, `birth` date NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci 1 row in set (0.00 sec)
通过 ALTER TABLE...DROP
语句可删除表中指定的列。
mysql> DESCRIBE cats; +--------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(150) | NO | | NULL | | | gender | char(1) | YES | | NULL | | | owner | varchar(150) | NO | | NULL | | | birth | date | NO | | NULL | | +--------+------------------+------+-----+---------+----------------+ 5 rows in set (0.01 sec) mysql> ALTER TABLE cats DROP gender; Query OK, 0 rows affected (0.21 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESCRIBE cats; +-------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(150) | NO | | NULL | | | owner | varchar(150) | NO | | NULL | | | birth | date | NO | | NULL | | +-------+------------------+------+-----+---------+----------------+ 4 rows in set (0.00 sec)
默认的 root 账户权限很高,一般不用于日常的作业。 可根据需要创建不同权限的账户来进行管理和作业。
CREATE USER 语句创建账户, DROP USER 删除账户。
GRANT 语句用于授予权限, REVOKE 用来回收权限。
SHOW GRANTS 查看权限的分配情况。
以下脚本展示了账户的创建并为其分配相应权限。
CREATE USER ‘finley‘@‘localhost‘ IDENTIFIED BY ‘password‘; GRANT ALL ON *.* TO ‘finley‘@‘localhost‘ WITH GRANT OPTION; CREATE USER ‘finley‘@‘%.example.com‘ IDENTIFIED BY ‘password‘; GRANT ALL ON *.* TO ‘finley‘@‘%.example.com‘ WITH GRANT OPTION;
该脚本分别为 finley
在本地 localhost
及 example.com
域上的数据库创建了账户,并赋予了所有权限。其中 %.example.com
里面的 %
为通配符,表示该账户对 example.com
上的数据库拥有权限。
其中 WITH GRANT OPTION
表示还给该账户赋予了能够修改其他用户权限的能力。
CREATE USER ‘admin‘@‘localhost‘ IDENTIFIED BY ‘password‘; GRANT RELOAD,PROCESS ON *.* TO ‘admin‘@‘localhost‘;
上面的脚本创建了名为 ‘admin‘@‘localhost‘
的账户并赋予了 RELOAD
,PROCESS
权限。
CREATE USER ‘dummy‘@‘localhost‘;
上面的脚本创建名为 ‘dummy‘@‘localhost‘
的账户并且无须密码登录,但并没有赋予任何权限。后续可通过 GRANT
来设置权限。
上面创建的账户都是全局作用域,即没有限制数据库。通过为账户指定相应的数据库可限制账户只对某些库有相应操作权限,达到更加精细的设置。
CREATE USER ‘custom‘@‘localhost‘ IDENTIFIED BY ‘password‘; GRANT ALL ON bankaccount.* TO ‘custom‘@‘localhost‘;
上面脚本创建的 ‘custom‘@‘localhost‘
账户对 bankaccount
库拥有全部权限,但仅限于从 localhost
进行连接。
CREATE USER ‘custom‘@‘host47.example.com‘ IDENTIFIED BY ‘password‘; GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON expenses.* TO ‘custom‘@‘host47.example.com‘;
上面脚本对 ‘custom‘@‘host47.example.com‘
开放 expenses
数据库的部分权限,其中包括 SELECT
,INSERT
,UPDATE
,DELETE
,CREATE
,DROP
且只能是操作 host47.example.com
上的数据库。
CREATE USER ‘custom‘@‘%.example.com‘ IDENTIFIED BY ‘password‘; GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON customer.addresses TO ‘custom‘@‘%.example.com‘;
上面脚本创建 ‘custom‘@‘%.example.com‘
账户并只对其开通 customer
库下面 addresses
的权限。
通过 SHOW GRANTS
来查看账户的权限。
mysql> SHOW GRANTS FOR ‘wayou‘@‘localhost‘; +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Grants for wayou@localhost | +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `wayou`@`localhost` WITH GRANT OPTION | | GRANT APPLICATION_PASSWORD_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,GROUP_REPLICATION_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SYSTEM_VARIABLES_ADMIN,XA_RECOVER_ADMIN ON *.* TO `wayou`@`localhost` WITH GRANT OPTION | +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec)
通过 SHOW CREATE USER
可查看创建该用户的脚本。
mysql> SHOW CREATE USER ‘wayou‘@‘localhost‘; +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | CREATE USER for wayou@localhost | +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | CREATE USER ‘wayou‘@‘localhost‘ IDENTIFIED WITH ‘caching_sha2_password‘ AS ‘xxx‘ REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT | +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
通过 REVOKE
可对权限进行回收,即撤回。
回收所有全局权限的示例:
REVOKE ALL ON *.* FROM ‘finley‘@‘%.example.com‘; REVOKE RELOAD ON *.* FROM ‘admin‘@‘localhost‘;
回收数据库作用域权限的示例:
REVOKE CREATE,DROP ON expenses.* FROM ‘custom‘@‘host47.example.com‘;
回收表作用域权限的示例:
REVOKE INSERT,UPDATE,DELETE ON customer.addresses FROM ‘custom‘@‘%.example.com‘;
同样,可通过 SHOW GRANTS
来检查权限更新的情况。
最后是账户的删除,通过 DROP USER
语句,以下是一个删除的示例:
DROP USER ‘finley‘@‘localhost‘;
通过查询内置的 mysql
数据库中 user
表,可看到添加后的所有用户。
mysql> SELECT user FROM mysql.user; +------------------+ | user | +------------------+ | mysql.infoschema | | mysql.session | | mysql.sys | | root | | wayou | +------------------+ 5 rows in set (0.00 sec)
MySQL 上手教程
标签:不同 oracle example new ons 包含 sch 知识 开放