CentOS 7 上升级 MariaDB 并支持 TokuDB 引擎

网上有一堆采用源码编译, 或者直接 so 文件替代,或者用 install plugin 之类的安装办法。
在我看来实在有点 low。 我们直接搜索怎么用 yum repository 安装 MariaDB,就可以去页面:

https://downloads.mariadb.org/mariadb/repositories

按照里面的选择,我们会得到如下几行,在 /etc/yum.repos.d 目录下创建一个 mariadb.repo 的文件内容如下:

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

 

然后运行

yum -y install MariaDB-tokudb-engine

就会自动升级 MariaDB 的版本, 并安装这个新的引擎以及相关的依赖包。

 

然后,  systemctl stop mariadb (可能会存在不能 stop 的情况, 那就 kill -9 了)。

再启动 mariadb.

在操作系统里, 运行 mysql , 在交互界面下,输入 \s,查看系统信息, 可以看到服务器的最新版本号,  输入 show engines, 可以看到: “| TokuDB | YES | Percona TokuDB Storage Engine with Fractal Tree(tm) Technology | YES ”

用 alter table tablename engine=tokudb,就可以把某一张表的引擎修改成 tokudb 了。

整个流程简单顺畅,没有拖泥带水。搞不懂外面那些小朋友的安装方法为什么要如此复杂。

以下是一张 800多万行的表迁移(InnoDB 到 TokuDB)前后的 select count(*) 比较:

MariaDB [stock]> select count(*) from dayline;
+———-+
| count(*) |
+———-+
| 8622272 |
+———-+
1 row in set (1 min 17.31 sec)

MariaDB [stock]> alter table dayline engine=’tokudb’;
Stage: 1 of 2 ‘Fetched about 1622000 rows, loading data still remains’ 18.8% of stage done
(中间居然还网络断开了!幸亏回来以后发现迁移算成功了)

MariaDB [stock]> select count(*) from dayline;
+———-+
| count(*) |
+———-+
| 8622272 |
+———-+
1 row in set (4.84 sec)

=======================

2017.12.4 后记:
升级到 MariaDB 后,由于 PHP MySQL 库头文件版本的不匹配会导致所有的 PHP 会报警:
PHP Warning: mysqli_connect(): Headers and client library minor version mismatch. Headers:50556 Library:100126 in
解决办法是: 卸载 php56w-mysql,安装 php56w-mysqlnd

 

===========

2018.3.12 后记:

外国的源很慢, 阿里和清华的源实际上上有的, 但是去 Web 网站都转去官网。
清华的正确路径是:

baseurl = https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/10.2/centos7-amd64
gpgkey = https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum//RPM-GPG-KEY-MariaDB

再后记, 安装完后, show engines 发现 tokudb  没有在列表里, 查看数据库错误日志发现:

 

2018-03-12 23:42:50 140254380386432 [ERROR] TokuDB will not run with transparent huge pages enabled.
2018-03-12 23:42:50 140254380386432 [ERROR] Please disable them to continue.
2018-03-12 23:42:50 140254380386432 [ERROR] (echo never > /sys/kernel/mm/transparent_hugepage/enabled)

根据提示运行 # echo never > /sys/kernel/mm/transparent_hugepage/enabled 然后重启 MariaDB,就可以看到 tokudb 的引擎了。

再再后记:

日志里发现错误“
”Mar 13 23:40:34   [ERROR] Missing system table mysql.roles_mapping; please run mysql_upgrade to create it

根据要求运行 mysql_upgrade 即可。 由于 socket 不是常规的 /var/lib/mysql/mysql.sock,导致报错, 去 .my.cnf  设置 socket=/opt/mysql/mysql.sock  正确的路径即可。

 

一个简单的 MySQL 的 CASE 语句以及 having 子句示例

我们有一张描述学校的表,dict_school,另外有一张学校和学段一对多的对应表 dict_school_period , 也就是说一个学校可以有多个学段,例如一个完全中学,就包含了初中和高中。

本例是要取出那些包含多个学段的学校,并把学段名称显示出来。

由于学段名称没有创建表,而存储时是按数字存放的,所以,我们需要在选出数据时用 case 语句来展示。

以下是一个完整的例子:

SELECT s.area,s.name,
CASE p.period
WHEN 1 THEN ‘小学’
WHEN 2 THEN ‘初中’
WHEN 3 THEN ‘高中’
END AS ‘学段’

FROM dict_school s
JOIN dict_school_period p ON s.id=p.dict_school_id
WHERE s.id IN (
SELECT dict_school_id FROM dict_school_period
GROUP BY dict_school_id HAVING COUNT(dict_school_id) >1
)

输出:

+———————–+—————————————————–+——–+
| area | name | 学段 |
+———————–+—————————————————–+——–+
| 上海市虹口区 | 上海市新市学校 | 小学 |
| 上海市虹口区 | 上海市新市学校 | 初中 |

开发环境下 MySQL 数据库差异同步的方法

在日常开发环境里,由于数据库表结构频繁变动,我们希望同步表结构,而不删除原有的数据。
假设我们在 S 机上修改表结构,而希望把表结构同步到 T 机上的数据库,但是又保留 T 机的数据,以下是具体步骤:

在 T 机上登录 S 机,只导出 Schema:
ssh S “mysqldump -d dbname” > /var/tmp/schema.sql

在 T 机上只导出数据,导出方式选择 -c 完整格式,也就是 INSERT 语句里包含列名。
mysqldump -c -t dbname >/var/tmp/data.sql

然后在 T 机上先导入 schema.sql,再导入 data.sql

mysql dbname </var/tmp/schema.sql
mysql dbname </var/tmp/data.sql

如果要把 T 机的数据也同步到 S 机的话,可以在 S 机上执行:

ssh T “mysqldump dbname” |mysql dbname

MySQL 基础命令

一、数据库操作SQL语句

1、显示服务器上当前存在什么数据库

show databases;

2、创建名称为user的数据库

create databases user;

3、删除名称为user的数据库

drop databases user;

4、选择user数据库

use user;

二、表操作SQL语句

1、显示当前数据库中存在什么表

show tables;

2、查看student表结构

describe student;

3、从student表中检索出唯一的不重复记录:

select distinct username from student;

4、更改表结构,将student表username字段的字段类型改为CHAR(25)

alter  table student change username usernamechar(25);

5、查看某张表的表头

desc student ;

6、修改表名

① rename table 原表名 to 新表名;

② alter table 原表名 rename to 新表名;

7、复制表

create table table2 select * from table1;

8、给表添加字段

alter table 表名 add  column 字段名 属性;

9、删除字段

alter table 表名 drop column 字段名

三、其它

1 获取当前时间

select now();

2 退出MySQL命令

exit(回车)

3  mysql服务的启动和停止

net start mysql

net stop mysql

4  登陆mysql

mysql -u 用户名 -p 用户密码

5 增加新用户

grant 权限 on 数据库.* to 用户名@登录主机 identified by “密码”

如,增加一个用户user1密码为password1,让其可以在本机上登录, 并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入mysql,然后键入以下命令:

grant select,insert,update,delete on *.* to user1@localhost Identified by “password1”;

如果你不想user1有密码,可以再打一个命令将密码去掉。

grant select,insert,update,delete on mydb.* to user1@localhost identified by “”;

相关连接:

抓取每张表的行数

MySQL 数据库远程连接常见错误 2003 和 2013

在 Windows 7 上安装了 Oracle Virtualbox,跑 CentOS 7 Guest。MariaDB 数据库默认侦听在 127.0.0.1。

VirtualBox 上开启两块网卡,一块做 NAT,把所有 3306 转发到 CentOS 上,一块做桥接。

enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.7.66 netmask 255.255.255.0 broadcast 192.168.7.255
enp0s8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.3.15 netmask 255.255.255.0 broadcast 10.0.3.255
连接不同的界面,可以看到如下错误:

# mysql -h 192.168.7.52 -u xiaobao -p
Enter password:
ERROR 2013 (HY000): Lost connection to MySQL server at ‘reading initial communication packet’, system error: 0

# mysql -h 192.168.7.66 -u xiaobao -p
Enter password:
ERROR 2003 (HY000): Can’t connect to MySQL server on ‘192.168.7.66’ (111)

解决问题的办法就是让 MySQL 听在所有网络界面上, 即注释掉 /etc/my.cnf 里如下一行:

bind-address = 127.0.0.1

重启: # service mariadb restart

当然, 2013 错误的另外一个解决办法是添加一行:

skip-name-resolve

实际上要考虑服务器端 /etc/resolv.conf 是否正确配置。