1、安装
安装:apt-
get
install mysql-server mysql-client
MySQL安装完成后不象SQL Server默认安装在一个目录,它的数据库文件、配置文件和命令文件分别在不同的目录,了解这些目录非常重要,尤其对于Linux的初学者,因为 Linux本身的目录结构就比较复杂,如果搞不清楚MySQL的安装目录那就无从谈起深入学习。
1、数据库目录
/var/lib/mysql/
2、配置文件
/usr/share/mysql(mysql.server命令及配置文件)
3、相关命令
/usr/bin(mysqladmin mysqldump等命令)
4、启动脚本
/etc/init.d/(启动脚本文件mysql的目录)
注:
1、如果执行安装命令后显示找不到一些文件,可以编辑 /etc/apt/sources.list 换一个源(如163的源),update后再试试。
deb http://mirrors.163.com/debian wheezy main non-free contrib
deb http://mirrors.163.com/debian wheezy-proposed-updates main contrib non-free
deb-src http://mirrors.163.com/debian wheezy main non-free contrib
deb-src http://mirrors.163.com/debian wheezy-proposed-updates main contrib non-free
deb http://mirrors.163.com/debian-security wheezy/updates main contrib non-free
deb-src http://mirrors.163.com/debian-security wheezy/updates main contrib non-free
deb http://http.us.debian.org/debian wheezy main contrib non-free
deb http://non-us.debian.org/debian-non-US wheezy/non-US main contrib non-free
deb http://security.debian.org wheezy/updates main contrib non-free
2、安装时若报 The following packages have unmet dependencies 之类的一堆依赖缺失错误,可以先执行 sudo ap-get -f install 安装相关依赖。
2、登录
"mysql [-h主机ip] [-P端口] -u用户名 -p密码 [DbName] " 或 "mysql [-h主机ip] [-P端口] -u用户名 -p [DbName] "
远程登录命令示例:
mysql -h localhost -uxiaozhang -p123
注:
1、安装后如果运行mysql命令时报如下错误,有可能是还没启动,先查看 /etc/init.d/mysql status 看看mysql是否已经启动,若没启动则 /etc/init.d/mysqld start即可。当然还有可能是其他原因,解决方法可参看http://www.cnblogs.com/eoiioe/archive/2008/12/28/1363947.html, ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)
2、安装完后默认有个root用户,出于安全考虑MySQL默认限制为只能通过localhost(即127.0.0.1)连接,在其他机子上访问或在本机上-h指定为本机真实IP都访问不了。
两步解决:
- 指定MySQL Server绑定的IP:编辑/etc/mysql/my.cnf 文件(Ubuntu 16 MySQL 5.7 放到了/etc/mysql/mysql.conf.d/mysqld.cnf)里 [mysqld] 下的 bind-address 字段(默认是127.0.0.1),将值改为本机的ip或域名或0.0.0.0(因为机子IP会变所以最好为0.0.0.0或域名),并重启数据库。
- 指定允许的访问来源Host:这里以root账户为例,编辑mysql db 下的user表,将root账户的Host限制改为'%',即允许该账户在所有地方登录访问数据库:
update user set Host ='%' where User='root';
flush privileges; //此句必不可少
3、启动、停止、重启等
启动文件mysql在/etc/init.d目录下,执行:/etc/init.d/mysql start|stop|restart|reload|force-reload|status
关闭/etc/init.d/mysql stop 或直接 mysqladmin -u用户名 -p密码 shutdown
4、修改密码
(网上有说借助mysqladmin的方法:先 mysqladmin -u USER -p password NEWPASSWORD ,提示输入旧密码,输入完后即可。但按之操作后不行,一直提示Access Denied,实际上此方法并没有把所有root用户密码均修改。另寻它法)
分为有root权限和忘记root密码两种:
- 有root权限:先用root账号登录mysql,然后执行:
UPDATE user SET password=PASSWORD('123456') WHERE user='root'; # MySQL5.7起 password 字段名改为 authentication_string FLUSH PRIVILEGES; #必不可少
也可以用Navicat等客户端连接后修改mysql下的user表,但改完还是得执行flush privileges;
- 忘记root密码:编辑/etc/mysql/my.cnf,在[mysqld]的段末加上一句:skip-grant-tables;重启mysql;此时不用密码即可登录,修改root密码并flushprivileges;编辑/etc/mysql/my.cn,注释掉skip-grant-tables;重启即可
(上述方法适用于MySQL5.7以前的版本;对于5.7,字段名 password 改为 authentication_string ,对于5.7以后的版本如8.0移除了PASSWORD函数所以上述方法不适用。更多参见:MySQL root密码修改)
5、常用操作
在mysql 命令行操作:
一、mysql服务操作 0、查看数据库版本 sql-> status; 1、net start mysql //启动mysql服务 2、net stop mysql //停止mysql服务 3、mysql -h主机地址 -u用户名 -p用户密码 //进入mysql数据库 4、quit //退出mysql操作 5、mysqladmin -u用户名 -p旧密码 password 新密码 //更改密码 6、grant select on 数据库.* to 用户名@登录主机 identified by "密码" //增加新用户 exemple: grant select,insert,update,delete on mydb.* to test2@localhost identified by "abc"; //增加一个用户test2密码为abc,只可在localhost即MYSQL数据库所在的那台主机上登录、只有查询、插入、修改、删除的权限 grant select,insert,update,delete on mydb.* to test2@localhost identified by ""; //不设密码 7、show grants; or SHOW GRANTS FOR 'user_name'@'host'; //查看授权信息 二、数据库操作 1、show databases; //列出数据库 2、use database_name //使用database_name数据库 3、create database data_name //创建名为data_name的数据库 4、drop database data_name //删除一个名为data_name的数据库 三、表操作 1、show databases;//列出所有数据库 2、use 数据库名; //选择某一数据库 3、show tables //列出所有表 4、建表: create table tab_name( id int(10) not null auto_increment primary key, name varchar(40), pwd varchar(40) ) charset=utf-8; //创建一个名为tab_name的新表 5、show create table test ; //查看建表的完整语句 5、drop table tab_name 删除名为tab_name的数据表 6、describe tab_name //显示名为tab_name的表的数据结构 7、show columns from tab_name //同上 8、delete from tab_name //将表tab_name中的记录清空 9、select * from tab_name //显示表tab_name中的记录 10、mysqldump -uUSER -pPASSWORD --no-data DATABASE TABLE > table.sql //复制表结构 四、修改表结构 0、复制表 create table new_tab_name like old_tab_name; //复制表,不包含旧表的数据 create table new_tab_name like old_tab_name; //复制表,包含原表数据 1、alter table tab_name rename to new_tab_name; //修改表名 2、alter table tab_name change old_col new_col varchar(40); //修改列名,必须为当前字段指定数据类型等属性,否则不能修改 3、alter table visitor modify mid int(11); //修改列定义 alter table tab_name modify col_name varchar(40) not null //修改字段属性,注若加上not null则要求原字段下没有数据 SQL Server200下的写法是:Alter Table table_name Alter Column col_name varchar(30) not null; 4、alter table tab_name ADD PRIMARY KEY (col_name); //说明:更改表得的定义把某个栏位设为主键。 5、alter table tab_name DROP PRIMARY KEY (col_name); //说明:把主键的定义删除 6、alter table tab_name add col_name varchar(20); //在tab_name表中增加一个名为col_name的字段且类型为varchar(20) 7、alter table tab_name drop col_name; //在tab_name中将col_name字段删除 五、数据的备份与恢复 1.执行外部的sql脚本 当前数据库上执行:mysql < input.sql 指定数据库上执行:mysql [表名] < input.sql 2.数据传入命令 load data local infile "[文件名]" into table [表名]; 3、备份数据库 mysqldump --opt school>school.bbb mysqldump -u [user] -p [password] databasename > filename (备份) mysql -u [user] -p [password] databasename < filename (恢复) 六、卸载 sudo apt-get remove mysql-server mysql-client sudo apt-get autoremove
在普通命令行操作(未进入mysql 命令行):
$ mysql -u USER -pPASSWORD -h HOSTNAME -e "SQL_QUERY" :执行指定操作
$ mysql -u USER -pPASSWORD -e "SQL_QUERY" > FILE :执行指定操作,结果输出到指定文件
$ mysql -u USER -pPASSWORD db_name < db.sql :从指定sql脚本执行sql命令
事务
关于事务隔离级别,见事务四大特性及事务隔离级别,查看隔离级别: select @@tx_isolation; 。
在MySQL中每条SQL命令默认都会被自动Commit(即默认开启自动提交功能),可以通过 SET AUTOCOMMIT=0; //0关闭、1开启 关闭。也可以用begin命令自己事务,此时自动提交功能被关闭:
-- 声明事务的开始 BEGIN(或START TRANSACTION); -- 定义保存点(回滚点) [ SAVEPOINT savepoint_name(名称); ] //可以没有 -- 提交整个事务 COMMIT; -- 回滚到事务初始状态 ROLLBACK; // 或 ROLLBACK TO SAVEPOINT savepoint_name(名称);--回滚到指定保存点
6、增加用户
grant select on 数据库.* to 用户名@登录主机 identified by "密码"
如:
grant select,insert,update,delete on *.* to user_1@"%" Identified by "123";
grant select,insert,update,delete on aaa.* to user_2@localhost identified by "123";
授予所有权限:
grant all privileges on *.* to root@"%" identified by "password"; flush privileges;
注:MySQL安装完后默认会建立一些账户,如下:
有两类:
- root账户:User为root,Host为本地地址127.0.0.1(对应IPV4)、::1(对应IPV6)、本机名,三者密码一样
- debian-sys-maint账户:这是系统自动生成的mysql用户,用于系统对MySQL的维护。debian和ubuntu系统都会这样做,密码是安装mysql时随时生成的,停止或重启服务都靠它。可以在/etc/mysql/debian.cnf查看到使用此用户的配置。
有时候会遇到即使是root用户也没法grant新用户的情况,此时可以以root用户登录,查看'mysql'表的root用户是否有grant权限:Grant_priv列是否为Y。
7、卸载
先用 purge 命令卸载:
apt-get --purge remove mysql-server apt-get --purge remove mysql-client apt-get --purge remove mysql-common
再清理残余:
apt-get autoremove apt-get autoclean rm /etc/mysql/ -R rm /var/lib/mysql/ -R
8、编码问题
参考资料:http://www.cnblogs.com/whiteyun/archive/2011/05/19/2051097.html
可以用 SHOW VARIABLES LIKE 'character%'; 命令查看数据库、连接、客户端等的字符集,结果示例如下:
+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+
可以用 SHOW VARIABLES LIKE 'collation_%'; 命令查看排序规则,结果示例如下:
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | utf8_general_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
MySQL默认字符集是字符集是 latin1(即iso8859-1),这是不支持中文的字符集,会造成程序乱码等问题,所以需要修改字符集,一般改为utf8即可解决问题。方法如下:
1、在[client]字段里加入default-character-set=utf8,如下:
[client]
port = 3306
socket = /var/lib/mysql/mysql.sock
default-character-set=utf8
2、在[mysqld]字段里加入character-set-server=utf8,如下:
[mysqld]
port = 3306
socket = /var/lib/mysql/mysql.sock
character-set-server=utf8
3、在[mysql]字段里加入default-character-set=utf8,如下:
[mysql]
no-auto-rehash
default-character-set=utf8
修改完成后,service mysql restart重启mysql服务就生效。
其他:
utf8字符集用1~4字节表示字符,然而在MySQL中实现的utf8最多用3个字节表示字符,这导致有些字符无法表示。MySQL在 5.5.3 之后增加了 utf8mb4
字符编码,mb4即 most bytes 4。简单说 utf8mb4 是 utf8 的超集并完全兼容utf8,能够用四个字节存储更多的字符,如可以表示emoj元素。具体可查看 mysql utf8与utf8mb4
9、存储引擎的选择
to do ...
MySQL Innodb和MyIsam存储引擎的主要区别:
锁粒度:行锁;表锁
事务:支持;不支持
外键:支持;不支持
全文索引:不支持(1.2.x开始支持);支持
聚簇索引:支持;不支持
10、其他
在CentOS下安装方式与上面不一样,可以借助yum安装。
(具体可查看:https://dev.mysql.com/doc/refman/8.0/en/linux-installation-yum-repo.html)
(这里版本:
Linux version 3.10.0-693.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) ) #1 SMP Tue Aug 22 21:09:27 UTC 2017
mysql Ver 8.0.11 for Linux on x86_64 (MySQL Community Server - GPL)
)
wget https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm yum localinstall mysql80-community-release-el7-1.noarch.rpm yum install mysql-community-server #时间比较漫长 service mysqld restart # status/stop/start #与上面所述Ubuntu下的有点区别,这里是 mysqld 而不是 mysql
安装过程并不会提示设密码而是自动产生一个初始密码。文档中说是产生在 /var/log/mysqld.log ,可以通过 grep 'temporary password' /var/log/mysqld.log 获得,然而本人安装后发现文件里内容是空的,解决:看签名的“修改密码”一节,借助"skip-grant-tables"设置密码。
参考资料:
http://www.cnblogs.com/xusir/p/3334217.html
https://blog.csdn.net/javazejian/article/details/61614366 MySQL基础(数据类型、SQ语法等)
https://blog.csdn.net/javazejian/article/details/69857949 MySQL进阶(索引、变量、存储过程、存储函数、触发器、事务等)