20211014のMySQLに関する記事は4件です。

mysql起動時のERROR! The server quit without updating PID fileを解決

起こったこと mysqlを学ぼうとインストール→起動の時点で躓きました。 % mysql.server start Starting MySQL .. ERROR! The server quit without updating PID file (/usr/local/var/mysql/MacBook-Pro.local.pid). 試したこと(ERROR!パターン) アンインストール→インストール→起動→ERROR! % brew uninstall mysql % brew install mysql % mysql.server start Starting MySQL .. ERROR! The server quit without updating PID file (/usr/local/var/mysql/MacBook-Pro.local.pid). 試したこと(SUCCESS!パターン) アンインストール→mysqlに関するファイルを全て削除→再度インストール→起動→SUCCESS! % brew uninstall mysql % sudo rm -rf /usr/local/mysql % sudo rm -rf /Library/StartupItems/MYSQL % sudo rm -rf /Library/PreferencePanes/MySQL.prefPane % sudo rm -rf /Library/Receipts/mysql-.pkg % sudo rm -rf /usr/local/Cellar/mysql* % sudo rm -rf /usr/local/bin/mysql* % sudo rm -rf /usr/local/var/mysql* % sudo rm -rf /usr/local/etc/my.cnf % sudo rm -rf /usr/local/share/mysql* % sudo rm -rf /usr/local/opt/mysql* % sudo rm -rf /usr/local/var/mysql/MacBook-Pro.local.pid % brew install mysql % mysql.server start Starting MySQL . SUCCESS! やっとこれで駆け出せそうです・・・。 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

パフォーマンスの良いSQL

今回はパフォーマンスの良いSQLの一例を紹介します。 ※今回は基礎がわかっている人向けです。基礎部分は別途記事にするのでお待ちください。 どちらがパフォーマンスが良い? ①SELECT goods FROM goods g  INNER JOIN goods_b gb on g.goods = gb.goods  WHERE g.stock = 10 and gb.type = 3  GROUP BY g.goods ②SELECT g.goods FROM goods AS g  WHERE g.goods =10  AND EXISTS(   SELECT * FROM goods_b gb   WHERE gb.type = 3   AND c.goods = gb.goods ) 出力結果は同じです。 ヒントは優先順です。 優先順のことが書かれたわかりやすい記事です。ブックマーク必須 https://qiita.com/suzukito/items/edcd00e680186f2930a8 答え ①です。 これはSELECTされる回数によって変わるという問題です。 ①は1回に対し、②は2回です。 テーブルを参照する回数に差異があります。 これの不思議なところは、データ量の多い少ないに関わらず①の文のほうが圧倒的に処理が速いところです。 先に絞り込みをして探した方が確かに早いもんなぁと初めのころは思いました。 最後に 疲れがたまる木曜日、今日も頑張って乗り切った。。。 皆さんも体調に気を付けて無理せず頑張りましょう。 他にも学んだことがあったら追記していきます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Github ActionsでMySQLが文字化けした場合の対応

概要 Github ActionsでMySQLを使ったテストを書いたが文字列のassertの際に文字化けでエラーになってしまった。 そのため、Github ActionsでMySQLを使う場合に文字コードをUTF-8にする方法を書きました。 default mysql と mysql-action について Github Actionsがデフォルトで用意しているmysql(default mysql) は、 charasetの変更ができず、テスト時の文字列比較でエラーになってしまうので、mysql-action を使用しました。 例. default mysql の場合、charset =latin1 になってしまう jobs: test: name: Test runs-on: ubuntu-latest services: mysql: image: mysql:5.7 ports: - 3306:3306 env: MYSQL_ROOT_PASSWORD: root options: --health-cmd "mysqladmin ping -h localhost" --health-interval 20s --health-timeout 10s --health-retries 10 steps: - name: show charset run: | mysql -h 127.0.0.1 --port 3306 -uroot -proot -e "show variables like 'chara%'" ↓ 結果 Variable_name Value character_set_client latin1 character_set_connection latin1 character_set_database latin1 character_set_filesystem binary character_set_results latin1 character_set_server latin1 character_set_system utf8 character_sets_dir /usr/share/mysql/charsets/ これだと charset が latin1 のため、文字列のassertでエラーになってしまう ※ docker のように command で設定できません 例. mysql-action の場合、charsetを指定可能 jobs: test: name: Test runs-on: ubuntu-latest steps: - name: Setup mysql-action uses: mirromutth/mysql-action@v1.1 with: host port: 3306 # Optional, default value is 3306. The port of host container port: 3306 # Optional, default value is 3306. The port of container character set server: 'utf8' # Optional, default value is 'utf8mb4'. The '--character-set-server' option for mysqld collation server: 'utf8_general_ci' # Optional, default value is 'utf8mb4_general_ci'. The '--collation-server' option for mysqld mysql version: '5.7' # Optional, default value is "latest". The version of the MySQL mysql database: 'test_db' # Optional, default value is "test". The specified database which will be create mysql root password: 'root' # Required if "mysql user" is empty, default is empty. The root superuser password - name: show charset run: | sleep 30 mysql -h 127.0.0.1 --port 3306 -uroot -proot -e "show variables like 'chara%'" ↓ 結果 Variable_name Value character_set_client utf8 character_set_connection utf8 character_set_database utf8 character_set_filesystem binary character_set_results utf8 character_set_server utf8 character_set_system utf8 character_sets_dir /usr/share/mysql/charsets/ utf8になった MySQLのrootユーザーのパスワードについて docker の mysql の場合、MYSQL_ALLOW_EMPTY_PASSWORD で指定することで root のパスワードを空にできますが、 mysql-action では、root のパスワードを空に設定できませんでした。 参考: https://github.com/mirromutth/mysql-action/issues/13 https://github.com/mirromutth/mysql-action/issues/17 ちなみに default mysql の場合の root のデフォルトパスワード は、root です ローカルPCでGithub Actionsを試したい act を使うことで可能 下記を参考にインストール https://github.com/nektos/act リポジトリにrepo/.github/workflows/test.ymlがある状態で下記を実行 cd repo act pull_request ※ default mysqlやdefault で用意されている aws cli などは、動きません。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RailsとTiDBの統合について

この記事は dev.toで発表されたものです。 このチュートリアルは、RailsとTiDBの統合に関する、おそらくWebで初めてのチュートリアルです。TiDBは、水平的なスケーラビリティ、高可用性、MySQLとの互換性を特徴とする、オープンソースの分散SQLデータベースです。 初心者にとって、ActiveRecordのような複雑なORMをTiDBに統合するのは難しい可能性があります。Web上にはこのトピックを扱っている記事がほとんどないことから、私はRailsユーザーによるTiDB導入を支援するために、このチュートリアルを執筆しました。 TiDB開発環境をローカルで構築する Railsとの統合に先立って、TiDBクラスタをローカルマシンにデプロイする必要があります。TiDBでは、TiDBエコシステム用のパッケージマネージャーであるTiUPによって、デプロイを円滑に進められるようになっています。 TiUPのインストール TiUPのインストールは、Darwin、Linuxのどちらのオペレーティングシステムからも簡単に行うことができます。次のコマンドを実行するだけです。 $ curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh これによって$HOME/.tiup/binがPATH環境変数に追加され、TiUPを直接使用できるようになります。 ローカルクラスタの確立 一般的にTiDBクラスタは複数のノードを必要とするため、デプロイが複雑で時間がかかる場合があります。そのためTiUPは、TiDBのテスト環境をローカルですばやく構築できる、TiUPコンポーネントのplaygroundを用意しています。 このコマンドは次のようにシンプルなものです。 $ tiup playground 次のように出力されます。 $ tiup playground Starting component ``playground``: /Users/hooopo/.tiup/components/playground/v1.4.1/tiup-playground Use the latest stable version: v5.0.0 Specify version manually: tiup playground <version> The stable version: tiup playground v4.0.0 The nightly version: tiup playground nightly Playground Bootstrapping... Start pd instance Start tikv instance Start tidb instance Waiting for tidb instances ready 127.0.0.1:4000 ... Done Start tiflash instance Waiting for tiflash instances ready 127.0.0.1:3930 ... Done CLUSTER START SUCCESSFULLY, Enjoy it ^-^ To connect TiDB: mysql --host 127.0.0.1 --port 4000 -u root -p (no password) To view the dashboard: http://127.0.0.1:2379/dashboard To view the Prometheus: http://127.0.0.1:9090 To view the Grafana: http://127.0.0.1:3000 これでローカルクラスタが確立されました。 TiDB Dashboardへのアクセス TiDBには、クラスタを監視するためのWeb UI、TiDB Dashboardが用意されています。これはすでにPDコンポーネントに組み込まれており、http://127.0.0.1:2379/dashboard から直接アクセスできます。 TiUPの詳細については、公式ドキュメントをご覧ください。 RailsをTiDB用に設定する TiDBクラスタを確立したところで、次にこれをRailsと統合します。 Railsプロジェクトの作成 TiDBはMySQLとの互換性があるため、MySQL用に設定されたRailsアプリを作成できます。 $ rails new myapp --database=mysql database.ymlの設定 database.ymlでは次の2つの重要な設定があります。 portを4000に設定します。ローカルのTiDBクラスタは、4000をデフォルトのポートとして使用します。 データベース接続変数tidb_enable_noop_functionsをONに設定します。Railsは、TiDBではデフォルトで無効になっているget_lock関数を使用する必要があります。 default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> port: 4000 username: root password: host: 127.0.0.1 variables: tidb_enable_noop_functions: ON URIメソッドを使用してデータベース接続を設定する場合も、設定方法は同様です。 default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> url: <%= ENV.fetch("DB_URL") || "mysql2://root:pass@localhost:4000/myapp" %> variables: tidb_enable_noop_functions: ON プライマリキー、自動インクリメント、一意インデックスの設定 usersというテーブルを作成します。 class CreateUsers < ActiveRecord::Migration[6.1] def change create_table :users do |t| t.string :email t.string :password t.string :username t.timestamps end end end 一意インデックスを追加します。 class AddUniqueIndexForEmail < ActiveRecord::Migration[6.1] def change add_index :users, :email, unique: true end end TiDBはMySQLとの互換性があるため、使用方法はスタンドアロンのMySQLデータベースとほとんど同じです。プライマリキー、自動インクリメント、一意インデックスなどの機能について互換性がない他の分散データベースと比較して、追加の処理が不要なTiDBは導入が非常に容易です。 ここまでで、次のようなデータテーブルが生成されます。 mysql> show create table users; + -------+------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------+ | Table | Create Table | +-------+------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------+ | users | CREATE TABLE `users` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `email` varchar(255) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, `username` varchar(255) DEFAULT NULL, `created_at` datetime(6) NOT NULL, `updated_at` datetime(6) NOT NULL, PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */, UNIQUE KEY `index_users_on_email` (`email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=30001 | +-------+------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------+ 1 row in set (0.01 sec) セーブポイントへのパッチの追加 TiDBとActiveRecordを結合するうえで1つだけ障害になるのが、現時点ではTiDBではセーブポイントがサポートされていないことです。そこで、これを解決する簡単なパッチを作成しました。 # https://github.com/rails/rails/blob/6-1-stable/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb#L313 require 'active_record/connection_adapters/abstract/database_statements.rb' module DisableSavepoint def transaction(requires_new: nil, isolation: nil, joinable: true) if requires_new requires_new = nil Rails.logger.warn "savepoint statement was used, but your db not support, ignored savepoint." Rails.logger.warn caller super(requires_new: requires_new, isolation: isolation, joinable: joinable) else super(requires_new: requires_new, isolation: isolation, joinable: joinable) end end end ActiveRecord::ConnectionAdapters::DatabaseStatements.send(:prepend, DisableSavepoint) Railsでセーブポイントを使用するのは、トランザクションがtrueをパラメータrequires_newに渡す場合に限られます。その場合は、このパッチによってrequires_newの値がnilに変更され、移行のためのログが出力されます。 私の経験では、Railsプロジェクトでセーブポイントが頻繁に使用されることはほとんどないため、移行が必要になった場合でも大きな問題はありません。マイグレーションを行う場合はセーブポイントを使用しますが、並行して実行する移行がなければ、セーブポイントを削除しても予期しない結果になることはありません。 参考資料 What's New in TiDB 5.0 tidb_enable_noop_functions TiDB's Compatibility with MySQL Source code for rails-tidb Demo
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む