安装
版本选择
关于 mysql 的版本选择,可以参考 如何选择 MySQL 版本 这篇文章。我们选择社区版的 5.6 版本。
安装步骤
为了方便用户安装,MySQl 官方提供了单独的 repository,对于Linux 发行版,有专门的 yum 源和 apt 源。将源添加好后,就可以很方便的通过 linux 的 yum 或者 apt 工具进行安装。这里我们以 yum 为例来讲述 MySQL 社区版本的安装过程。
- 首先下载 MySQL yum 源,页面位于 Download MySQL Yum Repository
注意下载的文件名虽然统一叫做
mysql80-community-release-<platform-and-version>.noarch.rpm
,但是里面包含了 8.0,5.7,5.6,5.5 等各个版本以及工具。
本地安装下载的源,我们以 centos7为例,下载的文件为
mysql80-community-release-el7-1.noarch.rpm
1
2$ sudo rpm -Uvh mysql80-community-release-el7-1.noarch.rpm
$ rpm -qa | grep mysql查看启用的版本,默认是启用 8.0 版本
1 | $ yum repolist enabled | grep mysql |
- 修改启用版本为 5.6
1 | $ sudo yum-config-manager --disable mysql80-community |
- 安装
1 | $ sudo yum install mysql-community-server |
如果安装时下载有问题,可以考虑修改 /etc/yum.conf 里的 proxy 代理配置为你的 http 代理地址 http://your_proxy_ip:port
配置
默认安装路径是 /var/lib/mysql
, 可以自定义数据文件路径。一般来说云主机的 data 盘较大,可以将数据库的数据存放于此
1 | [mysqld] |
这里自定义的/data/mysql
路径需要设置为 mysql 用户拥有
1 | $ sudo chown -R mysql:mysql /data/mysql |
开启慢查询
1 | [mysqld] |
开启 binlog
1 | [mysqld] |
设置字符集(character)及校对规则(collation,字符串比较规则),字符集默认是 latin1,我们设置为 utf8
1 | [mysqld] |
配置完成后,启动 mysqld 服务器进程
1 | $ sudo service mysqld start |
安全性控制
运行 mysql_secure_installation
命令,来对新安装的 mysql 进行安全性设置,这包括 root 密码设置、限制 root 只能本机登录、删除 test 库、删除匿名用户等。对于生产环境,强烈建议设置一下。
注意 5.7 及以上版本已经不需要运行该命令
性能测试
使用 sysbench 工具来对 MySQL 进行测试(这里我们只测试 select primary key)
1 | $ sysbench /usr/share/sysbench/oltp_read_only.lua help |
准备数据
1 | $ sysbench /usr/share/sysbench/oltp_read_only.lua --threads=4 --mysql-user=root --mysql-password=xxxxx --mysql-db=db_test --db-driver=mysql --tables=10 --table_size=1000000 prepare |
数据准备好之后,开始运行
1 | $ sysbench /usr/share/sysbench/oltp_read_only.lua --threads=16 --events=0 --time=300 --mysql-db=db_test --mysql-user=root --mysql-password=xxxxx --db-driver=mysql --table_size=1000000 --range_selects=off --db-ps-mode=disable --report-interval=1 --histogram run |
登录
通过 mysql_secure_installation
脚本设置好 root 密码后,就可以登录了
1 | $ mysql -h [host] -u [user] -p |
登录并使用某一数据库(例子中密码前面不能有空格)
1 | $ mysql -h [host] -u [user] -p[passwd] [DB_NAME] |
权限
创建用户
1 | mysql> CREATE USER 'user'@'localhost' IDENTIFIED BY 'password'; |
删除用户
1 | mysql> DROP USER 'user'@'host'; |
赋权限
1 | mysql> GRANT SELECT, INSERT, DELETE ON base.* TO 'user'@'localhost' IDENTIFIED BY 'password'; |
更新密码
1 | mysql> SET PASSWORD FOR 'user'@'host' = PASSWORD('new_pass'); |
常用命令
查看当前正在 use 的库
1 | mysql> use mysql; |
查看建表语句
1 | mysql> show create table t_xxx; |
查看索引
1 | mysql> show index from table t_xxx; |
查看字符集
1 | mysql> show variables like 'character_set_%'; |
查看连接
1 | mysql> show processlist; |
设置连接编码为 utf8
1 | mysql> SET NAMES 'utf8'; |
修改表结构
1 | mysql> ALTER TABLE [table] ADD COLUMN [column] VARCHAR(120); |
插入一条记录
1 | mysql> INSERT INTO [table] ([column], [column]) VALUES ('[value]', '[value]'); |
解释执行
1 | mysql> EXPLAIN SELECT * FROM [table] WHERE [column] LIKE '%[value]%'; |
更新数据
1 | mysql> UPDATE [table] SET [column] = '[updated-value]' WHERE [column] = [value]; |
为一列或者多列添加命名索引
1 | mysql> ALTER TABLE table ADD INDEX [index_name](column, ...); |
删除索引
1 | mysql> DROP INDEX index_name; |
使用 group by 和 having 来获取特定组数据
1 | mysql> SELECT * FROM table GROUP BY column_1 HAVING condition; |
设置所有 row 的某一列
1 | mysql> UPDATE table SET column_1 = value_1, ...; |
备份和恢复
物理备份
物理备份是拷贝数据库的文件,比较快,适用于数据迁移等场景。
逻辑备份
逻辑备份可以无视版本和架构对数据进行备份,比如进行 mysql 升级就可以使用逻辑备份来备份数据。逻辑备份通常结合全量备份和增量备份。
在 mysql 服务器本地,使用 mysqldump 进行全量备份
1 | $ mysqldump --single-transaction --all-databases --flush-logs -u [username] -p > db_backup.sql |
如果要备份特定的库和表,可以这样
1 | $ mysqldump --single-transaction --flush-logs -u [username] -p [db_name] <table_name> > db_backup.sql |
如果不需要导出建库,使用–no-create–db选项,不需要建表语句,使用 –no-create-info 选项;导出特定条件的行,使用 –where 选项。例如
1 | $ mysqldump -h 10.137.213.82 -udbuser -ppassword --no-create-info db_hgame_1020 t_user --where="accid=776085" > /tmp/776085.sql |
导入备份的 sql 语句
1 | $ mysql -hhostname -uusername -ppassword databasename < backupfile.sql |
或者使用 mysql 的 source 命令
1 | mysql> source backup.sql; |
如果备份的数据比较大,可以压缩一下
1 | $ mysqldump -u [username] -p --default-character-set=utf8 [db_name] | gzip > backup.sql.gz |
如果想将一台服务器的数据直接导入另外一台机器,可以
1 | $ mysqldump -u root -p database_name | mysql -h other-host database_name |
mysqldump 需要 SELECT 权限,对于没有指定 –single-transaction 选项的还需要 LOCK TABLES 权限。
对于增量备份,可以使用 binlog。
查看所有的 binlog
1 | mysql> show binary logs; |
查看当前正在写的 binlog
1 | mysql> show master status; |
导出特定时间的 binlog 以便根据 pos 来进行具体恢复(binlog 是二进制格式,利用 mysqlbinlog 工具导出成 sql)
1 | $ mysqlbinlog --start-datetime="2018-05-20 9:58:00" --stop-datetime="2018-05-20 10:01:00" /data/mysql/mysql-bin.000001 > /tmp/mysql_restore.sql |
通过 mysql_restore.sql 我们发现只需要恢复到 log_pos 为368312 的位置,则执行
1 | $ mysqlbinlog --stop-position=368312 /data/mysql/mysql-bin.000001 | mysql -uroot -p |
卸载
先查询安装了哪些 mysql 的文件,例如
1 | $ rpm -qa | grep mysql |
然后使用 yum remove
命令卸载
1 | $ sudo yum remove mysql |
其他
如果已知旧密码,需要修改 root 密码为新密码,可以这样
1 | $ which mysqladmin |
如果忘记密码,在 my.cnf [mysqld] 部分最后添加 skip-grant-tables 选项
1 | [mysqld] |
重启 mysqld
1 | $ sudo service mysqld restart |
使用 root 无需密码登录
1 | $ mysql -uroot |
更新密码
1 | mysql> use mysql; |
退出,删除 skip-grant-tables 选项并重启 mysqld 即可
参考资料
How to Benchmark Performance of MySQL & MariaDB using SysBench