こんなエラーがでてtd-agentが起動できない現象が、MySQL8.0環境下のサーバで発生しました。
libmysqlclient.so.20: cannot open shared object file: No such file or directory
今回、MySQL5.7がインストールしているサーバをMySQL8.0に入れ替えたのですが、そのタイミングでtd-agentが起動しなくなった備忘録です
続きを読むこんなエラーがでてtd-agentが起動できない現象が、MySQL8.0環境下のサーバで発生しました。
libmysqlclient.so.20: cannot open shared object file: No such file or directory
今回、MySQL5.7がインストールしているサーバをMySQL8.0に入れ替えたのですが、そのタイミングでtd-agentが起動しなくなった備忘録です
続きを読むMySQL 8.0 バージョンアップしたら、速度が2倍向上!便利な関数が使える!!等、色々なメリットがあります。 ・・が、 通常のサービスでデータベースがメジャーバージョンアップしたからといってサービスを停止して、バージョンアップってしないかなー?って思ってます。自分がやるのであれば、別のサーバ立てて旧バージョンからレプリケーション!可能な限り、ダウンタイムを減らしたいのでこの手法一点で進めます
ただ、今回は、かなり苦戦しています
次回、同じ状態にならないように、備忘録に残しておきます。
[Amazonブランド]Presto! マスク ふつうサイズ 200枚(50枚×4パック) PM2.5対応
異なるバージョン、もしくは、異なる サーバ間で、データベースのdump (mysqldump) および restore リストアを実施した時に、リストア先にデータベースもテーブルもないはずなのに、キー重複(Duplicate entry)が起きたりしたことはありませんか? え?、なにもないはずなのに。。。って。オカルトですよね。
この原因って、dump時の文字コードが原因している場合が多いですって話です。。。
プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)
知ってはいたけど、なかなか触る機会がなく、かつ、インストールを試したことすらしていなかったので、今回、インストールの手順をメモしました。 MySQL8.0は、2018/4/19 にリリースされ、以下の機能が更新、もしくは新機能として実装されました。
MySQL :: MySQL 8.0: MySQL 5.7よりも最大2倍高速
私個人として。地味なところではありますが、降順(Descending)インデックスの対応や、Window関数などが何気にうれしいです。
細かい部分はあとで検証するとして、今回は、amazon linuxにこの、MySQL 8.0をインストールしたメモを書いていこうと思います。
amazon linux2 にMySQL8をインストールする場合は、こちらをご覧ください!
続きを読む
MySQLのチューニングで一番効果があるものは、パラメータのチューニングでもなく、はたまた、マシンのスペックでもなく、
今回、MySQLのオプティマイザがぁ。。とか、オンメモリーにするためにはーとかの話は抜きで、何を勘所にして、どのように索引チューニングしていくかというのを中心に書いていきます
MySQL即効クエリチューニング ThinkIT Books
いままでなんで、きずかなかったのだろう。。
例えば、こんなテーブルがあったとして
DROP TABLE IF EXISTS test_tab1 ; CREATE TABLE `test_tab1` ( `Id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `CreatedAt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `Numeric_only_date_time` varchar(8) NOT NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ;
idはオートインクリメント値
numeric_only_date_timeは、現在の日付を、数字のみに表したもの(20180511みたいな)
という形式でデータを格納したい場合、みなさまはどうしますか?
自分でしたら
INSERT INTO test_tab1 (numeric_only_date_time) VALUES (DATE_FORMAT(CURRENT_TIMESTAMP,'%Y%m%d')) ;
で、まずINSERTすると思います。
結果は以下のような感じになります
SELECT * FROM test_tab1 ; +----+---------------------+------------------------+ | Id | CreatedAt | Numeric_only_date_time | +----+---------------------+------------------------+ | 1 | 2018-05-11 12:50:16 | 20180511 | +----+---------------------+------------------------+
今回シンプルなデータなので、あまりメリットは感じないかもしれませんが、仮に、numeric_only_date_timeのデフォルト(現在日付)にしたい場合で、もっとシンプルにINSERT文を発行したい時はどうしましょう?実はそれが簡単にできてしまうのです!!
続きを読むストアドプロシージャにて、トランザクションをかける場合、HANDLERの順番には注意しましょう!という話です。
Logicool ロジクール Bluetoothマウス M558
HANDLERだけ書くと、別途MySQLがもっているHANDLER構文も入ってしまいますが、例外処理(DECLARE 〜 HANDLER)の話を今回はします。
先に正しい順番を書きますね。
DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT; SELECT _sqlstate, _errno, _text; ROLLBACK; END; DECLARE CONTINUE HANDLER FOR NOT FOUND SET _not_found = 1; DECLARE CONTINUE HANDLER FOR SQLWARNING BEGIN GET DIAGNOSTICS CONDITION 1 _sqlstate = RETURNED_SQLSTATE, _errno = MYSQL_ERRNO, _text = MESSAGE_TEXT; END;続きを読む
私が知らなかっただけかもしれせんが、処理を途中で抜けることってストアドプロシージャって出来ないとばかり思っていたのですが、できるんですね汗
今まで、ストアドでこんなIF文のネスティングで書いてました。可読性悪いし、バグを誘発するしで何か良い手はないのかな?って思ってました
CREATE PROCEDURE `sp_test_proc`( IN _mode tinyint, -- (0: Normal 1: force delete 2: Batch ) INOUT _value varchar(32) , OUT _result_code int(11) ) BEGIN BEGIN IF _mode = 1 OR _mode = 2 OR _mode = 3 THEN IF _value='test' THEN SET _value = CONCAT(_value, '-TEST') ; ELSE SET _result_code = 8888 ; END IF ; ELSE SET _result_code = 9999 ; END IF ; 〜以降略 END ; END $$
あ。。処理何やっているの?とか、コードの書き方が変とかの指摘はなしで。。なんて、IF のネスティングを延々と書いてました。理由は前述の通り、処理を途中で抜ける方法を知らなかったからです。。
よくよく考えたら、おかしいなって調べていたら当たり前のように、そういうやり方がありました。いやあ、はじめて、BEGIN - END の意味を知った感じでお恥ずかしいです。。
続きを読む
たまーにしか使わないのに、その必要が急に出てきて、調べる時間が勿体無いので、ざっくりここにMySQLのDDLおよびSQLをメモしていきます。
マッスルジーニアス(Muscle Genius) チンニングバー 懸垂マシン ドア枠に引っ掛けるだけ 俺のドアジム? MG-DG02
とあるテーブルの内容を元にして、SQLで、shellファイルをつくって実行しちゃおうってのを無理やりつくってみました。
CREATE TABLE `files` ( `id` int(11) NOT NULL DEFAULT '0', `file_name` varchar(100) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
primary keyはidで、urlは、例えば、"abcdefg.jpg"ってのが入っていたとします。内容的にはこんな感じです
mysql> SELECT * FROM files LIMIT 3; +----+-----------+ | id | file_name | +----+-----------+ | 1 | a.jpg | | 2 | b.jpg | | 3 | c.jpg | +----+-----------+
今回、このfile_nameの中にあるファイル名を利用して、
#!/bin/bash wget http://test.test.local/download/a.jpg ・ ・ exit 0
というようなshellファイルを作成してみたいと思います
続きを読む
特に連番がないテーブルに意図的に連番を振りたいってこと、日々の運用で結構あったりませんか?以外と簡単にSQLでそれを実現できます!!!
例えば以下のようなテーブルがあり、これを題材にやってみたいと思います
mysql> DESC login ; +---------+------------+------+-----+-------------------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+------------+------+-----+-------------------+-------+ | userId | bigint(20) | NO | PRI | NULL | | | loginAt | datetime | NO | PRI | CURRENT_TIMESTAMP | | +---------+------------+------+-----+-------------------+-------+続きを読む
やってみたら、かなり私には、高度すぎて死にかけました。
やりたいことは、
MySQLで同列の異なる行と行の引き算をSQLで書くとこうなるってことです。
やってみたいことを文書で表すと、ユーザーのログインは前回のアクセスからどれくらいの感覚でログインしているのかを算出する場合、SQLでそれをどのように表現するかって感じになるのかなというのを試して見ました
例えば以下のようなテーブルがあり、これを題材にやってみたいと思います
mysql> desc login ; +---------+------------+------+-----+-------------------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+------------+------+-----+-------------------+-------+ | userId | bigint(20) | NO | PRI | NULL | | | loginAt | datetime | NO | PRI | CURRENT_TIMESTAMP | | +---------+------------+------+-----+-------------------+-------+
で、以下のようなデータが入っているものとします。ユーザーIDは、1,2,3とあり、それぞれログインの間隔が異なるものとします。 loginAtはログインした日付がはいっており、useridと、loginAtのセットで、primaryキーだとします。 つまり、同じユーザーidで複数、ログイン日付が入っていると想像してください
続きを読む