分类 mysql 下的文章

union 连接 实例

select * from table where company=A order by rand() limit 2 
union
select * from table where company=B order by rand() limit 2 

该语句可以实现 随机取出 AB公司各2条相关数据。

Linux 下 超大文件的编辑

应用场景:在此之前我也没有想到我会为了编辑一个54G大的 sql备份文件而想的头昏脑胀,线上有一个 大概120G的数据库,通过使用mysqldump 导出然后压缩 得到一个 16G的压缩文件,然后传出到本地,再解压,就得到了一个 54G的超大文件。

往常,通过使用 mysql -uroot -p dbname< back.sql 就可以顺利恢复了,不过问题就出在这里, 恢复的时候报了一个错误,大概的意思是 不支持 ngram插件

本地是一个 群晖的NAS 安装了MariaDB套件,即兼容mysql的一个产品,然而他并不支持 ngram (全文索引),这可如何是好啊?

不要急不要燥,该如何导入这个数据进数据库呢, 既然他不支持,那么删除掉这个 定义的语句 即可。

说干就干, vi back.sql

等的我花都谢了, 还在读文件,读54G 的文件。。。。 尝试sed 替换相应的内容, 这里进展不顺利。

这里不得不说, vi 操作 大文件还是很有用的, 只是操作 54G,太为难他了, 那就小一点,他总可以了吧。

尝试了各种 想直接编辑的方法都失败了 ,不得不退而求其次了,那就是把54打散切割, 再合并。

split -C 1024M /volume1/g.sql sql
vi sqlaa  #操作对应的内容后,保存退出
cat sql*> db.sql

不过经过实测,mysql -uroot -p dbname< back.sql 导入到MariaDB速度比较慢, 导入了2天,也还没导入完整,上次我记得是导入到mysql还挺快的。还有 一种办法通过 source 导入,进入mysql后通过mysql的终端 输入 source /sql文件的路径; 等待完成。

mysql8 安装后root登录不了

今天又在一台ubuntu上安装mysql8,这次不一样, 默认不是用系统的root帐号登录的,上次写 mysql8 安装与更改datadir数据目录 时是使用系统的root帐号操作的, 其中进展很顺利,没有遇到mysql登录不上root的问题, 不过这次现实俨然打脸了我,mysql -uroot -p 使用了很多方法都登录不了。

在中文搜索里, 搜了一堆都没有用,用 /etc/mysql/debian.cnf 里自动创建的用户 登录进去后
Userplugin
rootauth_socket
mysql.sysmysql_native_password
debian-sys-maintmysql_native_password

会看到 root的 plugin 和 下面2个不一样, 验证方式不一样,对很多资料也都提到了这一项,然后就开始教大家怎么怎么登录进root。
不过今天我这里 并不打算这样做(修改plugin的auth_socket),我们来想一想mysql 为什么要这样做呢?
其实不能登录只是我们的使用方式不对,不信 你尝试下这样,看看能登录不

方式一  :
采用 ubuntu的 root 帐号登录系统  然后再用  mysql -uroot -p 
方式二:
采用 sudo mysql -uroot -p

你会发现 这2种方式 都能成功登进mysql的 root 帐号里去。
所以类似的如果需要让ubuntu的系统用户能直接登进 mysql 还可以这样做

mysql> USE mysql;
mysql> CREATE USER 'YOUR_SYSTEM_USER'@'localhost' IDENTIFIED BY 'YOUR_PASSWD';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'YOUR_SYSTEM_USER'@'localhost';
mysql> UPDATE user SET plugin='auth_socket' WHERE User='YOUR_SYSTEM_USER';
mysql> FLUSH PRIVILEGES;
mysql> exit; 
sudo service mysql restart

所以 如果你不想用默认的 auth_socket 方法验证密码, 修改成 mysql_native_password 也是可以的。

mysql> USE mysql;
mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
mysql> FLUSH PRIVILEGES;
mysql> exit;

参考:资料

使用mysql workbench 来管理复用自己的SQL语句

在日常开发中,经常有需要调取数据做一定的分析的需求,但是这个需求只是偶然或者很少,但是又会有周期性的需要,我们一般是直接从数据库调取数据, 没有把相关需求做到程序中去。
这样以来,每次有这样的需求的时候就要重复写相应的SQL,时间一久难免会忘记,又需要重新构思sql语句,其实mysql workbench 就有一个很好的功能来帮助我们管理和复用这些SQL。
现在来看看把:
workbench.png

标号1 为添加收藏的按钮,点击后会弹出 保存 搜藏的对话框,确认备注名称
标号2 为自己收藏的语句,点击下拉框还可以看系统标记的其他快捷SQL
标号3 可以将自己的语句插入到左侧的编辑器,或者导出sql
标号4 即为自己收藏的语句,可以点进去 复用。

以下为其他自带的sql代码片段
bench.png

还有一个 就是通过ssh 内网登录 设置方法如下:
setting
更多实用功能自己体验把!

凭空select出连续的日期数据

我们在做数据统计的时候, 尤其按照特定的日期序列得到数据,每天都要展示没有的展示0,这个时候如果我们group by日期,很容易就得到我们的数据了。
但是每天都要展示, 没有的用0填充,这可有点不好办,那么有什么办法可以实现这样的需求呢。
方法1: 创建一个日期表,把group by的数据 join 对应的日期,那么就可以实现需求了,nice!
如创建 date表(每天写一条日期数据)

select a.dt,rmb from date d join left( select from_unixtime(ctime,'%Y-%m-%d')dt,sum(Rmb)rmb from Table group by dt)a on d.dt=a.dt;

方法2: 不需要创建date表,直接凭空生成连续的日期~方法参考stackoverflow的大神。

 select Days from (
        SELECT curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY AS Days
        FROM       (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c
    )aa WHERE aa.Days >= '2021-12-10' - INTERVAL 30 DAY   order by  Days  limit 30

该语句执行后得到从 2021-12-10开始之前的30天内的日期值,需要其他日期自己灵活运用就行了。

同样的 结合方法1:date表的内容 被上述sql替代即可,very nice!

方法3:mysql8+才支持,缩短了方法2的语句

 with recursive all_dates(dt) as ( 
    select '2021-12-1' dt
        union all  
    select dt + interval 1 day from all_dates where dt + interval 1 day <= '2021-12-15'
)
select * from all_dates

very very nice!
具体应用场景 如下图:
2021-12-16_10-28.png