BLOGTIMES
» ArchiveList (Tag for "mysql / php" )
«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/10/27

        Laravel でパスワードを忘れたときの再設定方法

        php  laravel 

        Laravel の Auth を使うとパスワードは DB にハッシュ化された状態で格納されます。
        これはこれでセキュリティのために必要な挙動なので、これに文句を言うつもりはありません。

        しかしながら、例えば管理者用のパスワードを忘れてしまい、DBを強制的に上書きしてログインしたいような場合、このハッシュがどのように作られているのか分からないとお手上げです。今日はまさにそんな状態に陥ってしまったので、解決方法を調べてみました。結論から言うと、以下のようにインタラクティブな php (artisan の tinker)を起動して、プログラムで DB を書き換えることができます

        $ php artisan tinker Psy Shell v0.9.9 (PHP 7.1.33 ― cli) by Justin Hileman >>> \App\User::where('UserId','1')->update(['password' => strtoupper(\Hash::make('hoge'))])

        これだと一撃で実行できるので、楽ちんです。

        [Laravel でパスワードを忘れたときの再設定方法 の続きを読む]

          at 14:11 |
          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

              PHP の内容を AST で解析する

              php  softwareengineering  tutorial 

              PHP のファイルが静的解析したくなったので、ソースから AST を得る方法を調べてみました。
              以前、Eclipse の ASTParser を使う話を書いたことがありましたが、それの PHP 版になります。

              今回の作業にあたって、以下のスライドがとても参考になりました。

              PHP は 7 になってから内部的に AST が利用されているため、以前よりも AST を得るのは簡単になっています。
              既に以下のような extension が提供されているので、いずれかをインストールすれば大丈夫です。

              今回はマニュアルが充実している前者の nikic/php-ast を入れてみることにしました。
              以下、構築メモになります。

              [PHP の内容を AST で解析する の続きを読む]

                at 23:31 |

                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 |
                  «Prev || 1 · 2 · 3 · 4 · 5 ·... | | Next»
                  » ArchiveList (Tag for "mysql / php" )