介绍
介绍
如果编写一个小工具、小游戏,可以直接写代码,它不涉及存储数据的操作,不过如果要编写一个网络工具、系统平台、网络游戏就需要将大量的数据存储起来。
早期存储数据都是使用文件存储,不过使用文件作为存储媒介是非常有局限性了。首先文件是独立的,很难进行统计操作;其次文件依赖IO句柄,频繁的进行打开文件、关闭文件,会对系统资源造成影响。
这时候数据库(Database)就应运而生了,它可以最大限度的解决存储和读取的问题,依赖公共的SQL语法标准,可以快速、灵活的对数据库引擎进行数据存储和数据读取。
MySQL是一款开源的、免费的、功能强大的数据库引擎,今天就跟着福哥来学习如何在我们的TFLinux操作系统上面安装MySQL数据库引擎吧。
基本信息
安装环境
CentOS:CentOS Linux release 7.6.1810 (Core)
Linux:Linux version 3.10.0-1062.el7.x86_64
GCC:gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
软件版本
mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz
准备工作
本地化
timedatectl set-timezone Asia/Shanghai
安装wget
如果环境里没有wget,通过yum安装一下
yum -y install wget
安装依赖包
yum -y install libaio numactl-libs
建立环境根目录
mkdir -p /tongfu.net/env/
建立安装包目录并进入
mkdir /packages cd /packages
安装MySQL 5.7
准备
mysql-5.7.28-linux-glibc2.12-x86_64.tar.g
下载安装包
下载mysql-5.7.28安装包
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz
创建账号
需要创建一个用户mysql
useradd mysql
安装mysql
我们下载的是编译好的二进制版本,直接解压缩即可使用
tar -xzvf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz -C /tongfu.net/env/ cd /tongfu.net/env/ mv mysql-5.7.28-linux-glibc2.12-x86_64/ mysql-5.7.28
初始化
使用mysqld进行初始化
mkdir mysql-5.7.28/data/ chown -R mysql.mysql mysql-5.7.28/ ./mysql-5.7.28/bin/mysqld --initialize --user=mysql --basedir=/tongfu.net/env/mysql-5.7.28/ --datadir=/tongfu.net/env/mysql-5.7.28/data/
注意:执行完上面的命令后,会有初始化密码打印出来,一定记得保存起来
2020-01-07T03:41:01.823712Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2020-01-07T03:41:03.374189Z 0 [Warning] InnoDB: New log files created, LSN=45790 2020-01-07T03:41:03.775803Z 0 [Warning] InnoDB: Creating foreign key constraint system tables. 2020-01-07T03:41:03.952070Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 87b0b720-30ff-11ea-9268-02420a100170. 2020-01-07T03:41:03.975895Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened. 2020-01-07T03:41:04.839331Z 0 [Warning] CA certificate ca.pem is self signed. 2020-01-07T03:41:05.515747Z 1 [Note] A temporary password is generated for root@localhost: FwaKHorkK6;3
配置
默认my.cnf
删除默认的my.cnf文件
rm -f /etc/my.cnf
启动
启动
修改启动脚本
[root@dev env]# vi ./mysql-5.7.28/support-files/mysql.server basedir=/tongfu.net/env/mysql-5.7.28/ datadir=/tongfu.net/env/mysql-5.7.28/data/
启动服务
./mysql-5.7.28/support-files/mysql.server start
修改默认密码
使用前面在初始化的时候系统返回的信息里的最后一行的初始化密码来修改root密码
./mysql-5.7.28/bin/mysqladmin -uroot -p password "abcdef"
登录
使用新密码登录
./mysql-5.7.28/bin/mysql -uroot -pabcdef
自动启动
添加自动启动脚本
[root@dev env]# cat > /lib/systemd/system/mysqld.service <<EOF [Unit] Description=mysqld After=network.target [Service] Type=forking ExecStart=/tongfu.net/env/mysql-5.7.28/support-files/mysql.server start ExecReload=/tongfu.net/env/mysql-5.7.28/support-files/mysql.server restart ExecStop=/tongfu.net/env/mysql-5.7.28/support-files/mysql.server stop PrivateTmp=false [Install] WantedBy=multi-user.target EOF
使用 systemctl 管理 mysqld 服务
systemctl enable mysqld # 设置自动启动 systemctl start mysqld # 启动服务 systemctl stop mysqld # 停止服务 systemctl restart mysqld # 重启服务
服务命令添加到系统目录
ln -s /tongfu.net/env/mysql-5.7.28/bin/mysql /usr/bin/ ln -s /tongfu.net/env/mysql-5.7.28/bin/mysqldump /usr/bin/
常见错误
常见错误1
在新版本的 mysql 里是找不到 my.cnf 配置文件的,因为 mysql 把大部分参数都设置了默认值,原则上我们不需要设置太多参数
如果想要设置的话,可以从旧版本的 mysql 环境下复制过来,放到mysql的安装目录下。当然,你也可以像以前那样放到 /etc/my.cnf,不过,这样不利用管理和迁移
常见错误2
在新版本的 mysql 里使用 group by 语句的时候有了限制,简单说就是 group by 的字段必须在select 内出现,这样的话 select * from xxx group by yyy 就行不通了。
which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
解决方法,在 my.cnf 里增加一行设置即可
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
这样就可以随便写了~
常见错误3
新版本的 mysql 在做同步复制的时候,发现 server_id 改了没有变化,始终是 4294967295,怎么回事?
经过各自尝试发现,原理新版本的 mysql 对于 server_id 的位数做了限制,数字不能超过10位,否则就会溢出了
TNND,能不能向后兼容啊~~
常见错误4
如果在导入 sql 的时候发现写入速度非常慢,可以从以下几个方面检查
检查 max_allowed_packet 是否设置太小了,这个会影响大 sql 的写入速度,一般情况下 dump 出来的 sql 都是多行用一个 insert 语句执行写入的
检查是不是使用的 innodb 引擎的数据表,innodb 数据表写和读都要比 myisam 慢一些
检查有没有关闭 log-bin,这玩意没关闭的话导入速度会慢几百倍,上千倍,强烈建议导入数据时候关闭它!!
检查 innodb_flush_log_at_trx_commit 有没有设置为 0,这玩意设置了非 0 的值的话导入速度也会慢几十倍,强烈建议导入数据时候关闭它!!
常见错误5
在通过 mysql 连接数据库时候提示找不到 socket 文件的话
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
解决方法,在 my.cnf 里设置一下
常见错误6
如果date类型的字段里包含“0000-00-00”数据或者datetime类型的字段里包含“0000-00-00 00:00:00”数据,会报如下错误:
Incorrect datetime value: '0000-00-00 00:00:00' for column 'xxx' at row 1
解决方法,在 my.cnf 里置空sql_mode设置,或者去掉“NO_ZERO_IN_DATE”、“NO_ZERO_DATE”设置
当然,福哥建议新库还是开启这个设置比较好~~
使用
连接数据库服务器
使用下面的命令连接到MySQL数据库服务器
[root@dev env]# mysql -uroot -pabcdef mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.28 MySQL Community Server (GPL) 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>
创建数据库
一个数据库服务器可以有若干个数据库,每个数据库作为一个项目的数据存储介质使用
使用下面的命令可以创建一个数据库,福哥创建的是test数据库
mysql> create database test default charset utf8; Query OK, 1 row affected (0.00 sec)
查看数据库列表
使用下面的命令查看服务器的数据库列表,列表包括很多系统数据库,其中还有我们刚刚创建的test库
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test | +--------------------+ 5 rows in set (0.00 sec)
选择数据库
我们要选择一个数据库作为我们正在操作的库
mysql> use test; Database changed
创建数据表
一个数据库可以有若干多个数据表,每个数据表代表着一组同类型的数据,例如:用户,留言等等
使用下面的命令可以创建一个数据表,福哥创建的是test数据表,包括两个字段id和name
mysql> CREATE TABLE `test` ( -> `id` int NOT NULL AUTO_INCREMENT, -> `name` varchar(45) NOT NULL, -> PRIMARY KEY (`id`) -> ); Query OK, 0 rows affected (0.00 sec)
插入新数据
现在我们要像这个数据表test里插入数据了,数据表test有两个字段,分别是int类型和varchar类型,我们可以根据这两个字段的类型向里面写入值
插入语句如下
mysql> INSERT INTO test (name) VALUES ('福哥'); Query OK, 1 row affected (0.10 sec)
查看数据表数据
现在数据表test里面已经有了一条数据了,我们可以通过SQL语句对这个数据表进行查询,得到数据表里面的数据
查询语言句如下
mysql> SELECT * FROM test; +----+--------+ | id | name | +----+--------+ | 1 | 福哥 | +----+--------+ 1 row in set (0.00 sec)
修改数据表数据
我们可以通过数据表的id精确地对这一行的数据进行修改操作,因为id这一列的数据是唯一的,可以帮助我们精确定位某一具体数据行
更新语句如下
mysql> UPDATE test SET name = '福哥加油' WHERE id = 1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0
删除数据表数据
如果需要删除掉数据表当中的数据,可以通过数据表的id精确定位某一行数据,将之删除掉
删除语句如下
mysql> DELETE FROM test WHERE id = 1; Query OK, 1 row affected (0.00 sec)
查看数据表数据
再次查看数据表数据,可以看到数据表里已经空空如也了
mysql> SELECT * FROM test; Empty set (0.00 sec)
退出数据库服务器
操作完了之后,就可以退出数据库服务器连接了
mysql> exit Bye
总结
学会了MySQL的使用技巧,今后我们就可以做一些非常有意思的东西了!目前福哥教大家的语言c/c++、java、php和python都是可以连接MySQL数据库的,结合MySQL数据库我们可以做一些中大型的项目,包括且不限于一个博客,一个论坛,一个留言板,一个换装游戏,一个情景游戏等等。
接下来福哥会一个一个地介绍使用c/c++、java、php、python操作MySQL的方法,童鞋们一定要跟上哦~~