[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
BLOGTIMES
» ArchiveList (Tag for "mysql" )
«Prev || 1 · 2 · 3 · 4 · 5 · | Next»
2023/03/14

MariaDB が yum/dnf でアップデートできなくなっていたので

mysql  centos7  centos8  rockylinux9 

MariaDB は yum/dnf で自動的にアップデートされるようにしていたのですが、いつの間にか以下のようなエラーが出るようになってしまっていました。

warning: /var/cache/yum/x86_64/7/mariadb-main/packages/MariaDB-server-10.3.38-1.el7.centos.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID c74cd1d8: NOKEY The following updates will be applied on host.example.jp: ================================================================================ Package Arch Version Repository Size ================================================================================ Updating: MariaDB-client x86_64 10.3.38-1.el7.centos mariadb-main 11 M MariaDB-common x86_64 10.3.38-1.el7.centos mariadb-main 82 k MariaDB-compat x86_64 10.3.38-1.el7.centos mariadb-main 2.2 M MariaDB-server x86_64 10.3.38-1.el7.centos mariadb-main 25 M MariaDB-shared x86_64 10.3.38-1.el7.centos mariadb-main 113 k Transaction Summary ================================================================================ Upgrade 5 Packages Updates failed to install with the following error message: GPG key retrieval failed: [Errno 14] curl#37 - "Couldn't open file /etc/pki/rpm-gpg/MariaDB-Server-GPG-KEY"

どうやら GPG のキーが新しくなった*1ようで、エラーを解消するにはこれをインストールしてやる必要があります。
MariaDB の公式マニュアル通りに以下を実行することで大丈夫でした。

sudo rpm --import https://supplychain.mariadb.com/MariaDB-Server-GPG-KEY

at 21:31 |
2021/02/22

Dokcer で Redmine + MariaDB サーバを立ててみた

docker  redmine  mysql  dockercompose 

今度は Redmine + MariaDB を Docker 化していきます。

Redmine も MariaDB もどちらも公式のイメージを使います。

今回の Redmine は要件として

  • バージョンは 3.x 系統であること
  • パスは /redmine で参照できること

というのがあるので、この部分についてはカスタマイズを行っています。

ファイルを配置したら以下のコマンドで起動できます。

docker-compose up -d

起動ができたら http://hostname:3000/redmine/ でアクセスができるはずです。

マイグレーション

既存の環境からの DB のマイグレーションについては、docker-compose exec redmine-db bashで MariaDB のコンテナに入り、MariaDB にデータをインポートすれば良いと思います。ファイルについては ./data ディレクトリ以下に必要なファイルをコピーすれば OK です。

ファイル構成

docker-redmine-mariadb/  ├ docker-compose.yml  └ redmine/    └ Dockerfile


    at 22:55 |
    2020/11/05

    php + MariaDB で Malformed communication packet というエラーが出るときは

    mysql  php  centos7 

    今日は朝から php + MariaDB の環境で以下のエラーが発生して困ってしまいました。

    500 SQLSTATE[HY000]: General error: 1835 Malformed communication packet (SQL: select * from ・・・・)

    Malformed communication packet というエラーは初めて見たかもしれません。

    MariaDB をダウングレードして暫定対処

    原因としては MariaDB のバージョンアップに起因するようなので、以下のように MariaDB をダウングレードして暫定対象しました。

    systemctl stop mariadb yum downgrade MariaDB-server MariaDB-common MariaDB-shared MariaDB-client MariaDB-compat MariaDB-devel --skip-broken yum --showduplicates search MariaDB-* yum install MariaDB-server-10.4.15-1.el7.centos.x86_64 MariaDB-client-10.4.15-1.el7.centos.x86_64 systemctl status mariadb systemctl enable mariadb

    同じ話題が Stack Overflow にも

    以下の Stack Overflow のエントリににもあるように、意外と同じところでハマった人は多いようです。
    これを見ると PHP 7.3 では発生しないという話も出ているので PHP 7.1 と最新版の Maria DB の問題みたいですね。


      at 12:58 |
      2019/10/29

      gem mysql から mysql2 に移行してみる

      ruby  mysql 

      昔書いた Ruby のプログラムを CentOS 7 上で動かそうとしたのですが、MariaDB が 10.4 と比較的新しいバージョンだったので gem で mysql がインストールできないので困ってしまいました。

      mysqlを見ると、最終アップデート日が 2013 年になっていて、最近はメンテナンスされていないようです。このまま粘っても解決の見込みも立たないので、mysql2 に移行してしまうことにしました。

      ソースの書き換えは大きく3箇所

      基本的には以下の3箇所を変更してやれば、基本的な動作はするようです。
      Date などの部分を自動的に cast する機能がついたようですが、これは :cast => false でオフにしてあります。

      # モジュールの読み込み require 'mysql' require 'mysql2' # 接続 @db = Mysql::connect('localhost', 'user_name', 'pass', 'db_name') @db = Mysql2::Client.new(:host => 'localhost', :username => 'user_name', :password=> 'pass', :database => 'db_name', :cast => false) # 結果の取得 rows.each_hash rows.each
      [gem mysql から mysql2 に移行してみる の続きを読む]

        at 22:24 |
        2019/09/09

        CentOS 7 + MariaDB の組み合わせで gem mysql2 がエラーになるときは

        ruby  centos7  mysql 

        CentOS 7 に MariaDB をインストールして、Ruby の gem mysql2 実行したらエラーになってしまって困ってしまいました。

        エラーメッセージを読む限りリンカのエラーのようなので、もう一度良く MariaDB のインストールを確認したら MariaDB-shared が入っていないのが原因だったようで、以下のコマンド1行で解決でした。MariaDB-devel だけでいけると思っていたのが、勘違いでしたね。

        yum install -y MariaDB-shared

        CentOS 7 への MariaDB のインストール

        ハマらないように次回からは以下のような感じでインストールすることにしようと思います。

        curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash yum install -y MariaDB-server MariaDB-client MariaDB-devel MariaDB-shared systemctl start mariadb systemctl enable mariadb mysql_secure_installation

          at 16:28 |
          2019/07/05

          MariaDB を 10.3 にしようとしたら「A manual upgrade is required.」と言われたので・・・

          mysql 

          先日、CentOS 7 の MariaDB を 10.3 にアップデートした話を書きましたが、10.1 → 10.3 の場合は 「A manual upgrade is required. 」と言われてしまうことが分かりました。
          ちょうど yum でアップデートしようとすると、以下のようなエラーが出ます。

          Resolving Dependencies --> Running transaction check ---> Package MariaDB-server.x86_64 0:10.1.40-1.el7.centos will be updated ---> Package MariaDB-server.x86_64 0:10.3.16-1.el7.centos will be an update --> Finished Dependency Resolution Dependencies Resolved ======================================================================================================================================== Package Arch Version Repository Size ======================================================================================================================================== Updating: MariaDB-server x86_64 10.3.16-1.el7.centos mariadb-main 24 M Transaction Summary ======================================================================================================================================== Upgrade 1 Package Total download size: 24 M Is this ok [y/d/N]: y Downloading packages: Delta RPMs disabled because /usr/bin/applydeltarpm not installed. MariaDB-server-10.3.16-1.el7.centos.x86_64.rpm | 24 MB 00:00:50 Running transaction check Running transaction test Transaction test succeeded Running transaction ****************************************************************** A MySQL or MariaDB server package (MariaDB-server-10.1.40-1.el7.centos.x86_64) is installed. Upgrading directly from MySQL 10.1 to MariaDB 10.3 may not be safe in all cases. A manual dump and restore using mysqldump is recommended. It is important to review the MariaDB manual's Upgrading section for version-specific incompatibilities. A manual upgrade is required. - Ensure that you have a complete, working backup of your data and my.cnf files - Shut down the MySQL server cleanly - Remove the existing MySQL packages. Usually this command will list the packages you should remove: rpm -qa | grep -i '^mysql-' You may choose to use 'rpm --nodeps -ev <package-name>' to remove the package which contains the mysqlclient shared library. The library will be reinstalled by the MariaDB-shared package. - Install the new MariaDB packages supplied by MariaDB Foundation - Ensure that the MariaDB server is started - Run the 'mysql_upgrade' program This is a brief description of the upgrade process. Important details can be found in the MariaDB manual, in the Upgrading section. ****************************************************************** error: %pre(MariaDB-server-10.3.16-1.el7.centos.x86_64) scriptlet failed, exit status 1 Error in PREIN scriptlet in rpm package MariaDB-server-10.3.16-1.el7.centos.x86_64 Verifying : MariaDB-server-10.3.16-1.el7.centos.x86_64 1/2 MariaDB-server-10.1.40-1.el7.centos.x86_64 was supposed to be removed but is not! Verifying : MariaDB-server-10.1.40-1.el7.centos.x86_64 2/2 Failed: MariaDB-server.x86_64 0:10.1.40-1.el7.centos MariaDB-server.x86_64 0:10.3.16-1.el7.centos Complete!

          仕方がないのでマニュアルでアップデート

          マニュアルでアップデートと言っても、やることは一旦アンインストールしてから、再インストールするだけです。
          とりあえずエラーメッセージに従って、非互換な部分について確認します。
          やはり主な問題は sql_mode の部分でしょうか。

          ちなみに yum remove しても /var/lib/mysql の下のデータファイルは消えませんが、念のため全データのダンプは取っておきます。
          .conf は .rpmsave にリネームされてしまうので、特別な設定を入れている場合にはファイルを復元しておきます。

          具体的には以下のような感じでしょうか。

          systemctl stop mariadb yum remove MariaDB-server yum install MariaDB-server mv /etc/my.cnf.d/server.conf{,.bak} mv /etc/my.cnf.d/server.conf{.rpmsave,} systemctl start mariadb mysql_upgrade -u root -p

            at 18:16 |
            2019/06/07

            CentOS7 の MariaDB を 10.3 にアップデートする

            mysql  centos7 

            CentOS 7 に載っている MariaDB 5.5 を 10.3 にアップデート*1してみたので、その手順をメモ。

            アップデート自体は yum で OK

            単に MariaDB を更新するだけならば、以下の手順ですんなりアップグレードできます。

            curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | bash yum clean all yum update -y mysql_upgrade -u root -p

            問題になるのは SQL_MODE の STRICT_TRANS_TABLES

            MariaDB (MySQL)は当初はいろいといい加減な部分がありましたが、最近は機能も増えていろいろと厳密になってきています。

            特にバージョンアップの際に問題になると思われるのは、最近のバージョン(10.2.4 以降)の SQL_MODE にデフォルトで設定されている STRICT_TRANS_TABLES という指定です。これにより INSERT 文の書き方がいい加減な場合、これまで通っていた INSERT 文が通らなくなるという不具合が発生します。

            以下が MariaDB 10.3 系でのデフォルトの SQL_MODE です。

            MariaDB [none]> show variables like 'sql_mode'; +---------------+-------------------------------------------------------------------------------------------+ | Variable_name | Value | +---------------+-------------------------------------------------------------------------------------------+ | sql_mode | STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +---------------+-------------------------------------------------------------------------------------------+

            ちなみに、この SQL_MODE は

            • 10.1.7 以前は指定なし
            • 10.1.7 は NO_ENGINE_SUBSTITUTION, NO_AUTO_CREATE_USER
            • 10.2.4 以降は STRICT_TRANS_TABLES, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION

            という設定になっているようです。

            とりあえず、デフォルトから STRICT_TRANS_TABLES を除くためには /etc/my.cnf.d/server.cnf[mariadb] のセクションに以下を追加する必要があります。

            sql_mode='ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

            変更後に MariaDB のデーモンを再起動させると、SQL_MODE が以下のようになっていることが確認できるはずです。

            MariaDB [none]> show variables like 'sql_mode'; +---------------+-----------------------------------------------------------------------+ | Variable_name | Value | +---------------+-----------------------------------------------------------------------+ | sql_mode | ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +---------------+-----------------------------------------------------------------------+
            • *1: DB をアップデートするといろいろ動かなくなったりするのであまりやりたくなかったのですが、あるテーブルで Row size too large (> 8126) というエラーを吐くようになってしまったので、ROW_FORMAT=DYNAMIC に変換するための苦肉の策です。

            at 17:38 |
            2019/05/09

            Windows 10 でコマンドプロンプトから MySQL (MariaDB) を使うと文字化けする?

            windows10  mysql 
            レガシーコンソール - Windows 10 でコマンドプロンプトから MySQL (MariaDB) を使うと文字化けする?

            Windows 10 のコンソール上から MySQL (MariaDB) にログインすると、文字コードをきちんと CP932 や SJIS にしていても日本語が文字化けすることがあるようです。

            することがある」とちょっとぼやかした書き方なのは、同じバージョンの Windows 10 と MySQL (MariaDB) の組み合わせで導入しても文字化けする端末とそうでない端末があり、僕が調べた限りでは再現条件が不明です。確認方法は簡単で、以下のようなテーブルを使わない SQL を打ち込んでみるだけです。嘘のような話ですが、こんな単純なSQLですら文字化けします。

            SELECT 'あああああ';

            いろいろ調べてみると Windows 10 1809 のコンソールには以下のバグがあり、今のところ Fix されていないようです。この指示に従って文字化けしているマシンの cmd.exe の設定をレガシーコンソールモードにしてみると、文字化けが解消することが確認できました。こういうのが OS のバグというのは困ったものです。

            バージョン 1809 の OS 上でコンソール出力が正しく表示されない問題について

            本問題は対象のバージョンの OS で導入された新しいコンソールの不具合に起因して発生しています。
            出力ストリームに紐づけられた内部的なコードページ テーブルの初期化処理に不足があり、内部処理でマルチバイト文字を正しく認識することができず、正しくコンソール出力を行えない問題が発生します。


              at 12:41 |
              2018/12/16

              MariaDB の utf8 テーブルに絵文字を格納するには

              javascript  mysql 

              MariaDB に UTF-8 の絵文字を格納したい場合には、歴史的経緯から charset を utf8mb4 にしておく必要があります。

              このブログも含めて、既存のテーブルが utf8 の場合にに utf8mb4 に切り替えようとするといろいろ面倒なことがあるので、最小限の変更でなんとか誤魔化す方法がないかと思って調べてみると、数値文字参照でエスケープするという方法を見つけたのでメモ。

              例えば 🦊 を &#x1F98A; にしてしまえば 1 バイト文字だけになるので、テーブル定義を変更しなくても DB に格納できることになります。
              ただ、この逃げ方は内容の検索とかを行う場合に問題になりますが、4バイトの文字はほぼ絵文字なので、今回は目を瞑ることにしました。

              ちょうど以下のルーチンを使わせていただきました。

              EcmaScript 6 の String.prototype.codePointAt および String.fromCodePoint を使えば、次のように書けます。
              function utf8mb4_encode_numericentity(str) { var re = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g; return str.replace(re, function(match) { return '&#x' + match.codePointAt(0).toString(16).toUpperCase() + ';'; }); }

                at 23:04 |
                2018/10/18

                mysqldumpslow をヒントに MariaDB/MySQL をチューニング

                mysql  tuning 

                あるプロジェクトで使っている MySQL(というか MariaDB)が遅いので、mysqldumpslow を使ってチューニングしてみました。

                mysqldumpslow*1 というのは slow ログファイルを解析して、要約を表示してくれるユーティリティで、これを使うと slow ログの中でもよりボトルネックになっているクエリを探し出すことができます

                まずは slow ログを MariaDB/MySQL に吐かせる

                mysqldumpslow を使うためには、対象となる slow ログ(時間がかかる SQL のログ)を手に入れる必要があります。
                通常の MariaDB/MySQL では、slow ログは以下のように無効になっているはずです

                MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'slow_query%'; +---------------------+------------------+ | Variable_name | Value | +---------------------+------------------+ | slow_query_log | OFF | | slow_query_log_file | hostname-slow.log | +---------------------+------------------+ 2 rows in set (0.00 sec) MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'long_query%'; +-----------------+----------+ | Variable_name | Value | +-----------------+----------+ | long_query_time | 2.000000 | +-----------------+----------+ 1 row in set (0.00 sec)

                これを以下のクエリによって書き換えてやります。
                設定は即時有効になりますが、再起動時には元に戻ります。常に出力する場合には my.cnf に定義を書込んでください。
                また、ここでは slow ログの閾値を 0.5 秒としていますが、場合によってはもっと小さくした方が良いかもしれません。

                SET GLOBAL long_query_time = 0.5; SET GLOBAL slow_query_log = 'ON'; FLUSH LOGS;

                slow ログを mysqldumpslow に喰わせる

                あとは出力された slow ログを以下のような感じで mysqldumpslow に喰わせると結果を得ることができます。

                mysqldumpslow /path/to/hostname-slow.log | less

                クエリ内の数値や文字列は 'S' や 'N' に置換されて纏められるので、slow ログの量が多くても出力結果はかなり少なくなっているはずです。あとはこの出力結果を EXPLAIN して、クエリの実行計画を見ながらインデックスなどを調整してやれば OK です。


                at 21:16 |
                «Prev || 1 · 2 · 3 · 4 · 5 · | Next»
                » ArchiveList (Tag for "mysql" )