20191023のMySQLに関する記事は7件です。

AWSを使ってホームページを公開するまで。

 AWSで新規プロジェクトを立ち上げようとしたらよくわからない不具合で止まったのでその全貌のメモ。

1 AWSでアカウントを作る。

 リージョンは東京。
 別の地域、特に現在地から遠いところだと最大0.1秒程度のラグが出るらしい。

2 EC2インスタンス立ち上げ。

  • EC2を起動
  • キーペア作成
  • インスタンスIDをコピーしてメモしとく
  • Elastic IPとインスタンスIDを関連付ける
  • セキュリティグループを開いてポートの開放
    • インバウンドタブを開いて編集
    • ルールの追加
    • HTTPを選択して保存
terminal
$ cd
$ mv Downloads/XXX.pem  .ssh/
$ cd .ssh/
$ chmod 600 XXX.pem
$ ssh -i XXX.pem ec2-user@Elastic IP

 これでSSH接続完了。

  [ヒント]

terminal
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory

 上記のようなエラーが出た場合は、

  1. ターミナルをいったん閉じる。
  2. Terminal -> Preferences -> Profiles -> Advanced
  3. 最下部の Set locale environment variables on startup のチェックを外す。
  4. もう一度SSH接続し直す。

 これで改善される。

3 環境づくり

 まずパッケージのアップデートを行う。

terminal
$ sudo yum update

 次に一度に必要なものをインストール。

terminal
$ sudo yum install \
git make gcc-c++ patch \
libyaml-devel libffi-devel libicu-devel \
zlib-devel readline-devel libxml2-devel libxslt-devel \
ImageMagick ImageMagick-devel \
terminal
$ sudo yum install -y openssl-devel

Node.jsをインストール

terminal
$ sudo curl -sL https://rpm.nodesource.com/setup_6.x | sudo bash -
$ sudo yum install nodejs

rbenvとruby-buildをインストール

terminal
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source .bash_profile
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ rbenv rehash
$ rbenv install X.X.X
$ # これはかなり長くかかる場合もあるので痺れを切らせて閉じたり変な入力をしないように!
$ rbenv global X.X.X
$ rbenv rehash
$ ruby -v
$ # 入れたバージョンと同じなら問題なし。

MySQLのインストール

 今回は5.6を入れる。

terminal
$ sudo yum install mysql56-server mysql56-devel mysql56
$ sudo service mysqld start
$ sudo service mysqld status
$ # ここで running と出れば大丈夫。
$ sudo /usr/libexec/mysql56/mysqladmin -u root password 'XXXpasswordxxx'
$ mysql -u root -p
$ # パスワードを入れて問題なければ quit で終了。

SSH鍵ペアを作る

terminal
$ ssh-keygen -t rsa -b 4096
$ cat ~/.ssh/id_rsa.pub
$ # これで出てきた文字列をコピーする。
  • GitHubのhttps://github.com/settings/keysに行く。
  • New SSH key を押してタイトルを入れ、keyのところに先ほどコピーした文字列を入力する。
terminal
$ ssh -T git@github.com

unicorn導入

gemfile
group :production do
  gem 'unicorn', '5.4.1'
end

 config/unicorn.rb を作成。

config/unicorn.rb
app_path = File.expand_path('../../', __FILE__)
worker_processes 1
working_directory app_path
pid "#{app_path}/tmp/pids/unicorn.pid"
listen 3000
stderr_path "#{app_path}/log/unicorn.stderr.log"
stdout_path "#{app_path}/log/unicorn.stdout.log"
timeout 60
preload_app true
GC.respond_to?(:copy_on_write_friendly=) && GC.copy_on_write_friendly = true
check_client_connection false
run_once = true
before_fork do |server, worker|
 defined?(ActiveRecord::Base) &&
   ActiveRecord::Base.connection.disconnect!
 if run_once
   run_once = false # prevent from firing again
 end
 old_pid = "#{server.config[:pid]}.oldbin"
 if File.exist?(old_pid) && server.pid != old_pid
   begin
     sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
     Process.kill(sig, File.read(old_pid).to_i)
   rescue Errno::ENOENT, Errno::ESRCH => e
     logger.error e
   end
 end
end
after_fork do |_server, _worker|
 defined?(ActiveRecord::Base) && ActiveRecord::Base.establish_connection
end

 と入力する。

terminal
$ sudo mkdir /var/www/
$ sudo chown ec2-user /var/www/
$ cd /var/www/
$ git clone リポジトリURL
$ # このリポジトリURLは各リポジトリを選択した際に右のほうに出る clone or download という緑色のボタンのところに出る。

gemのインストール

terminal
$ cd /var/www/リポジトリ名
$ # 以降はこのディレクションで作業する
$ ruby -v

 ローカルでの開発環境で bundler のバージョンを確認。

local_terminal
$ bundler -v
terminal
$ gem install bundler -v X.X.X
$ # 先ほど確認したバージョンのものを入れる。
$ bundler install
$ # この作業もかなり時間がかかる場合がある。

環境変数の設定

terminal
$ rake secret
$ # これで表示された文字列をコピーしておく。
$ sudo vim /etc/environment
$ # 入力後に i を押してインサートモードにし、

DATABASE_PASSWORD='MySQLのパスワード'
SECRET_KEY_BASE='さっきの文字列'

 入力後は esc を押した後に :wq で保存して終了。

  [ヒント]
 :q!で保存せずに終了。
 出られなくなったりめちゃくちゃになった時はこれ!

 その後 exit でいったんログアウトする。

terminal
$ env | grep SECRET_KEY_BASE
$ env | grep DATABASE_PASSWORD

 これで現在の環境変数を確認できる。
 セキュリティグループを選択してインバウンドタブの編集から、
 カスタムTCP、3000番ポートを開放する設定を追加。

4 データベースを作る

config/database.yml
production:
  <<: *default
  database: XXX
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock

 変更を加えた時は必ず

termianl
$ git pull origin master

 をする。

 そして現在(2019/10/23)の問題点……

terminal
$ rails db:create
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
Couldn't create 'XXX_development' database. Please check your configuration.
rails aborted!
Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
/var/www/XXX/bin/rails:9:in `<top (required)>'
/var/www/XXX/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:create
(See full trace by running task with --trace)

 以前まではこれで普通にデータベースを作れていたのだが、
 何故か今回このような表示が出てデータベースが作れなくなってしまった。
 エラー画面を元に様々な解決法を検索して試してみたが、
 (2)が別の数字に変わるだけで依然進展せず、
 インスタンスをかれこれ3回も初めからやり直すことに……

 解決法が分かり次第更新するが、もしこれを見て解決法が分かりそうな方は是非お力を貸していただきたいです!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CloudSQL(MySQL)でutf8mb4を使う

概要

ユーザの投稿時に絵文字 (?) を入れたら、SQL内でエラーが起きた。
その対応のために、テーブルに保存するには charset = utf8mb4 という文字コードにしないといけない。
かつ、それを検索するためには、 collate = utf8mb4_bin にする。
collateの値については試行錯誤していたのもあり、確実ではないが、他のblogなどを色々参照していくと、binにするのが良さそうということ、たしかに検索もできた。

前提

すでに以下のようなテーブルがあり、この中のnameに絵文字が入るという要件があるとする

CREATE TABLE `users` (
  `id` varchar(255) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `photo_url` varchar(255) DEFAULT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

環境

CloudSQL(MySQL 第2世代 5.7)

やり方

  1. 対象のカラムのcharsetとcollateを変更する
  2. プログラムの方でdbにアクセスする際にcharsetを utf8mb4 にする あとは
  3. テーブルのデフォルトの文字列を変更する
  4. データベースのデフォルトの文字列を変更する などの処理をしたほうが後々はいいが、ここでは割愛する(そんな全部絵文字対象ですか?ってこと + CloudSQLでの設定がよくわからん

1. 対象のカラムのcharsetを変更する

charset を utf8mb4、 collate を utf8mb4_bin にする

alter table users modify name varchar(255) character set utf8mb4 COLLATE utf8mb4_bin;

以下のようになっていればOK

mysql> show create table users;

CREATE TABLE `users` (
  `id` varchar(255) NOT NULL,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `photo_url` varchar(255) DEFAULT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

2. CloudSQLにアクセスする charsetを utf8mb4 にする

Goでsqlxを使っている例であるが、他の言語でもあまり変わりはないはず
charset=utf8mb4 にする

db, err := sqlx.Connect("mysql", fmt.Sprintf("%s:%s@unix(%s/%s)/%s?charset=utf8mb4", user, password, socDir, connectionName, databaseName))

まとめ

とりあえずutf8mb4を使うとデータを入れることができ、また utf8mb4_bin を利用すると検索ができる。

utf8mb4_bin の他にいろいろあるが、果たして一番何が正しいのかがまだわかっていない(indexを貼るような場合が鍵なはず

その他

ちなみにDBの方だけ対応している場合は以下のようにエラーになる(in句に顔文字を入れた場合

Error 1271: Illegal mix of collations for operation ' IN '

ローカルからCloudSQLProxyを使って、CloudSQLにアクセスする方法が便利
https://cloud.google.com/sql/docs/mysql/sql-proxy?hl=ja

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

InnoDBのファイルフォーマット、行フォーマットについてまとめ(Mysql5.6の話)

以前調べてまとめた内容になります。

mysql5.6時代にまとめているので、現在の最新バージョンと違う箇所もあるかもしれないので注意してください
間違いがあったらご指摘いただけるとありがたいです

InnoDBではテーブル作成時に指定されるファイル形式と行フォーマットによって、
データ格納時のストレージの使用率が変動する。

ファイルフォーマット

・Antelope
    MySQL 5.6までのデフォルトファイルフォーマットで、可変長カラム(VARBINARY, VARCHAR, BLOB, TEXT)
    の先頭768バイトを B-tree ノードのインデックスレコードに格納し、残りをオーバーフローページに格納する。

・Barracuda
    可変長カラム(VARBINARY, VARCHAR, BLOB, TEXT)の全てを外部のオーバーフローページに格納し、
    クラスタインデックスレコードにそのページへのポインタ(20B)のみを格納する。
    所謂8kbの壁の中で、Antelope以上に多くのカラムを指定することができるようになる。
    また、Barracudaにしても行フォーマットでCOMPACTなどを選択していると、
    そのテーブルはAntelopeのファイル形式が適用される

行フォーマット

・REDUNDANT
    古いフォーマットでchar系での消費ストレージは指定した文字数×charasetの最大サイズになる
    char(8)のutf-8で指定すれば8*3=24が固定で消費されるということ

・COMPACT
    UTF-8 文字列の最適化などにより REDUNDANT よりもデータサイズが小さくなる。
    REDUNDANTと違い消費されるストレージは入力された文字のバイト数が計算される。
    つまりアルファベットが入力されれば1バイトしか消費されない。

・DYNAMIC
    Barracudaでないと指定できない。
    上記したクラスタインデックスレコードにそのページへのポインタ(20B)のみを格納することで、
    8kbの壁を超えて(正確には実際に超えている訳ではなく、20Bだけインデックスレコードに登録することで、
    データの保存量を増やす)データを登録出来るようになる。
    Barracudaを選択してもDYNAMICかCOMPRESSEDを使用しないとこれは使えない。
    またDYNAMICの場合はデータ容量が少ない場合はオフページではなくBツリーノードに残る可能性がある。
    データの圧縮を行わない。

・COMPRESSED
    Barracudaでないと指定できない。DYNAMICと同じ仕様を持ちさらにデータの圧縮を行う。
    圧縮を行うことで、I/Oが軽減され、スループットが改善される。
    ただし、CPUの使用率が増加するという問題があるので、サーバーのスペック次第というところもある。
    また、圧縮機能はメモリが多く搭載されている場合で読み込み負荷の高いアプリケーションを実行する場合特に有効

行の最大サイズ

InnoDBには1行あたりインラインに登録できるデータは8kbまでという決まりがあるが、
そもそも指定したフィールドのデータ型のサイズの合計が65535バイトを超えてはならないという決まりがある。これはvarcharなどで文字列を指定した場合に適用される。text型などはこの範疇には入らない。
なので、想定文字数が多い場合はvarcharではなく、text型にすべき

Index column size too large. The maximum column size is 767 bytesについて

フィールドの文字コードをutf8mb4にすると、文字列あたりの最大byte数が4byteになるので、utf8では指定できたindexがサイズオーバーで登録出来ない場合ある。indexの最大サイズはデフォルトで767であるが、行フォーマットをDYNAMICかCOMPRESSEDに変更することで、innodb_large_prefixオプションでindexのサイズを最大3072byteまで拡張できる。

以下参考サイト
InnoDBの制限とファイルフォーマットAntelopeとBarracudaの違い - かみぽわーる
MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.2.13.7 物理的な行構造
MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.8.3 使用されているファイル形式の識別

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLには2つの通信方式があるんですってことを知った話

とある古いプロダクトのDBに入れない・・・

いつもの下記コマンドでログインを試みましたところ・・・

$ mysql -uroot -p

下記の出力が出てきてしまい、入れません。

Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'

sockファイルが無いみたいなので、これを使って、

$ ps aux | grep mysql
root      9004  0.0  0.0 115356  3204 ?        S    Jan22   0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/tmp/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql     9208  0.0 11.3 1504812 459820 ?      Sl   Jan22 133:13 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/tmp/mysql.sock

これを見る限り、tmpの下にありそうですね。

シンボリックリンクを貼ってあげればよさそう・・・と思ったのですが、このサーバーあまりにも昔のものすぎてサーバー管理者不明、ドキュメントも無いのでsudoでコマンド実行するためのパスワードが不明ということで、OMG状態でしたので今回は、mysqlになんとか接続できる方法をベテランのエンジニアの方に教えてもらいました。

解決策

mysqlの通信方法を利用する。

  • localhost・・ソケットファイルを使用した接続

  • 127.0.01・・TCP/IPを使用した接続

なんと、127.0.0.1で接続するとソケットファイルを使わないんですね。これなら安心してmysqlに繋げることができます。
railsのdatabase.ymlに書かれたdatabaseのユーザーとパスワードを確認して、それでログインすることができました。

$ mysql -h 127.0.0.1 -u ユーザー名 -p
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CentOS8にRuby on Rails 6.0(MySQL)の開発環境を作る

前提

  • windows10上のVirtual Box 6.0で構築
  • Virtual Box 6.0をインストール後から開始
  • CentOS8のisoファイル(CentOS-8-x86_64-1905-dvd1.iso)はダウンロード済み

各種バージョン

  • Virtual Box 6.0
  • CentOS 8
  • Ruby 2.6.5
  • Ruby on Rails 6.0
  • MySQL 8.x.x
  • Nodebrew 12.13.0

全体の流れ

  • Virtual Boxに仮想マシンを作成
  • OSインストール
  • CentOS 初期設定
  • Ruby・Railsのインストール
  • Nodeのインストール
  • MySQLのインストール
  • Firewallの設定
  • プロジェクトの作成&各種設定
  • サーバーの起動

Virtual Boxに仮想マシンを作成

「新規」を押下。
2019-10-22 (0).png

  • 仮想マシンの作成
    • 名前: rails_test(任意)
    • マシンフォルダー: (任意)
    • タイプ: Linux
    • バージョン: Red Hat (64-bit)

2019-10-22 (1).png

以降は任意で設定。今回はデフォルトのままで進めました。

仮想マシンが作成されたら、「設定」を押下します。

「システム」→「マザーボード」→「起動順序」のハードディスクの順序を一番上に持ってきてください。
これをしないと、OSインストール直後の再起動時にisoファイルが再読み込みされます。

2019-10-22 (11).png

「ネットワーク」→「アダプター 2」で「ネットワークアダプターを有効化」にチェックを入れ、割り当てを「ホストオンリーアダプター」に設定。

2019-10-22 (12).png

OSインストール

仮想マシンを起動、ダウンロードしたisoファイルを選択。
2019-10-22 (13).png

日本語を選択して続行
2019-10-22 (16).png

赤色の枠を付けたところを設定します。

  • 時刻と日付...アジア/東京
  • ソフトウェアの選択...最小限のインストール
  • インストール先...デフォルト
  • ネットワークとホスト名...Ethernet(enp0s3), Ethernet(enp0s8)の接続を両方ONにする。

リリースノートによると、Virtual Boxを使用した上で「ソフトウェアの選択」がデフォルトのままだと問題があるようです。

2019-10-22 (17).png

ここまでできたら、インストールの開始をします。rootのパスワードを設定します。ユーザーは後で作成するのでここでは何もしません。

2019-10-22 (22).png

CentOS 初期設定

インストールが終了して、再起動したらrootでログインしてください。

ネットワークの設定

# nmcli device status

すると、ホストオンリーアダプターが接続されていないと思うので、以下のコマンドで接続します。

# nmcli c up id enp0s8

パッケージのアップデート

# dnf -y update

※CentOS8から、yumコマンドからdnfコマンドになりました。

ユーザーの作成・パスワードの設定

# useradd -m [ユーザー名]
# passwd [ユーザー名]

パッケージのインストール

dnf install -y git gcc-c++ glibc-headers openssl openssl-devel readline readline-devel zlib zlib-devel bzip2 tar make

Ruby・Railsのインストール

作成したユーザーでログインしてください。

rbenvのインストール

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

環境変数の設定

$ echo 'export RBENV_ROOT="$HOME/.rbenv"' >> ~/.bash_profile
$ echo 'export PATH="${RBENV_ROOT}/bin:${PATH}"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
$ rbenv --version

最後にバージョンが表示されればインストール完了です。

Rubyインストール

$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ rbenv install -l
$ rbenv install -v 2.6.5
$ rbenv rehash
$ rbenv global 2.6.5
$ ruby -v

最後にバージョンが表示されればインストール完了です。(バージョンは適宜)

Rails インストール

$ gem update --system
$ gem install rails
$ gem install bundler
$ rbenv rehash
$ rails -v

最後にバージョンが表示されればインストール完了です。(バージョンは適宜)

Nodeをインストール

$ curl -L git.io/nodebrew | perl - setup
$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile
$ source ~/.bash_profile
$ nodebrew install-binary stable
$ nodebrew ls
$ nodebrew use v12.13.0
  ↑「nodebrew ls」で表示された、使用するバージョンを指定
$ node -v

最後にバージョンが表示されればインストール完了です。(バージョンは適宜)

MySQLのインストール

rootでログインしします。

インストール

# dnf install -y mysql-server mysql-devel

起動

# systemctl start mysqld

初期設定

# mysql_secure_installation

いくつか質問があるので、適宜選択してください。
今回は下の流れで行いました。
基本はyes、パスワードポリシーの強度は0(=8文字以上)です。

[root@localhost ~]# mysql_secure_installation

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: y

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 0
Please set the password for root here.

New password: [新パスワード]

Re-enter new password: [新パスワード(確認)]

Estimated strength of the password: 50 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

完了したらMySQLにrootでログインしてください。

ユーザーの作成・権限付与

> CREATE USER '[作成ユーザー名]'@'%' IDENTIFIED BY '[パスワード]';
> GRANT ALL ON *.* TO '[ユーザー名]'@'%';
> FLUSH PRIVILEGES;

DB作成

アプリで使用するDBを作成しておきます。

> CREATE DATABASE [DB名];

ここまでできたらログアウトして、MySQLを再起動します。

# systemctl restart mysqld

Firewallの設定

ポートの3000番を開けておきます。これを忘れて「サーバー起動してもアクセスできない」というのがあるあるでした。

# systemctl start firewalld
# firewall-cmd --add-port=3000/tcp --zone=public --permanent
# firewall-cmd --reload

プロジェクトの作成&各種設定

rootからログインしなおします。

$ mkdir [プロジェクト名]
$ cd [プロジェクト名]
$ bundle init

作成されたGemファイルを「vi Gemfile」などで開き、railsのコメントアウトを外します。

source "https://rubygems.org"
gem "rails", "6.0.0"            ←コメントアウト(#)を外す

gemのインストール

$ bundle install
$ bundle exec rails new . -d mysql --skip-bundle
$ gem install mysql2
$ bundle update
$ bundle install

project/config/database.ymlの設定

default: &default
  adapter: mysql2
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: [ユーザー名]
  password: [パスワード]
  socket: /var/lib/mysql/mysql.sock
  database: [DB名]
  charset: utf8mb4
  encoding: utf8mb4
  collation: utf8mb4_unicode_ci

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default

I18n言語設定(必要であれば)

・gemの追加... "rails-i18n"
・config/locales/にja.ymlファイルを作成

/project/config/application.rb(追記)
config.time_zone = "Tokyo"
config.active_record.default_timezone = :local

# 言語ファイルを階層ごとに設定するための記述
config.i18n.load_path += Dir[Rails.root.join("config", "locales", "**", "*.{rb,yml}").to_s]

# アプリケーションが対応している言語のホワイトリスト(ja = 日本語, en = 英語)
config.i18n.available_locales = %i(ja en)

# 上記の対応言語以外の言語が指定された場合、エラーとするかの設定
config.i18n.enforce_available_locales = true

# デフォルトの言語設定
config.i18n.default_locale = :ja

文字コードutf8mb4対応(必要であれば)

config/initializers/utf8mb4.rb
module Utf8mb4
  def create_table(table_name, options = {})
    table_options = options.merge(options: 'ENGINE=InnoDB ROW_FORMAT=DYNAMIC')
    super(table_name, table_options) do |td|
      yield td if block_given?
    end
  end
end

ActiveSupport.on_load :active_record do
  module ActiveRecord::ConnectionAdapters
    class AbstractMysqlAdapter
      prepend Utf8mb4
    end
  end
end

webpackerのインストール

rails 6.0から必須になりました。

$ npm install -g yarn
$ rails webpacker:install

webpackerでjs.erbを使用できるようにする

jsをerbで使用する方がほとんどだと思います。

$ bundle exec rails webpacker:install:erb

サーバーの起動

jsをホットリロードしてくれるので、

$ bin/webpack-dev-server

を実行したあとにサーバー起動するのをおすすめします。

$ rails s -b 0.0.0.0

終わりに

とりあえず以上で動くようにはなります。
あとは適宜設定していただければと思います。
ザーっと書きなぐったかんじなので、不足している点があればコメントいただければ幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【編集中】pgloaderでMySQL→Postgresへの移行を行う

はじめに

pgloaderでMySQLで作成したZabbixのDBをPostgresにインポートする手順を記載する。

環境

  • CentOS 7.6
  • Zabbix 4.2
  • Postgres 11.5
  • MySQL 8.0

pgloaderのインストール

* gitのインストール
sudo yum install -y git


* インストールしたいディレクトリに移動
cd /usr/local/src

* インストール
git clone https://github.com/dimitri/pgloader.git
cd pgloader
chmod +x ./bootstrap-centos7.sh
sudo ./bootstrap-centos7.sh
make pgloader

下記のようなエラーが発生した場合は、10を入力し、
CONTINUEしたところ、正常にインストールされた。(インストールが正常に行われたかは不明)

...
[package pgloader.citus]..........................                                                                                                 [3537/4093]
[package pgloader.utils]                                                                                                                                      
debugger invoked on a NAME-CONFLICT in thread                                                                                                                 
#<THREAD "main thread" RUNNING {10005E85B3}>:                                                                                                                 
  EXPORT PGLOADER.CATALOG:FIELD-NAME causes name-conflicts in                                                                                                 
  #<PACKAGE "PGLOADER.PARSER"> between the following symbols:                                                                                                 
    PGLOADER.CATALOG:FIELD-NAME, PGLOADER.PARSER::FIELD-NAME                                                                                                  
See also:                                                                                                                                                     
  The ANSI Standard, Section 11.1.1.2.5                                                                                                                       

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.                                                                                              

restarts (invokable by number or by possibly-abbreviated name):                                                                                               
  0: [KEEP-OLD                     ] Keep PGLOADER.PARSER::FIELD-NAME accessible in PGLOADER.PARSER (shadowing PGLOADER.CATALOG:FIELD-NAME).                  
  1: [TAKE-NEW                     ] Make PGLOADER.CATALOG:FIELD-NAME accessible in PGLOADER.PARSER (uninterning PGLOADER.PARSER::FIELD-NAME).                
  2: [RESOLVE-CONFLICT             ] Resolve conflict.                                                                                                        
  3: [RETRY                        ] Retry                                                                                                                    
                                     compiling #<CL-SOURCE-FILE "pgloader" "src" "package">.                                                                  
  4: [ACCEPT                       ] Continue, treating                                                                                                       
                                     compiling #<CL-SOURCE-FILE "pgloader" "src" "package">                                                                   
                                     as having been successful.                                                                                               
  5:                                 Retry ASDF operation.                                                                                                    
  6: [CLEAR-CONFIGURATION-AND-RETRY] Retry ASDF operation after resetting the                                                                                 
                                     configuration.                                                                                                           
  7:                                 Retry ASDF operation.                                                                                                    
  8:                                 Retry ASDF operation after resetting the                                                                                 
                                     configuration.                                                                                                           
  9: [ABORT                        ] Give up on "pgloader"                                                                                                    
 10: [CONTINUE                     ] Ignore runtime option --eval "(ql:quickload \"pgloader\")".                                                              
 11:                                 Skip rest of --eval and --load options.                                                                                  
 12:                                 Skip to toplevel READ/EVAL/PRINT loop.                                                                                   
 13: [EXIT                         ] Exit SBCL (calling #'EXIT, killing the process).                                                                         

(NAME-CONFLICT #<PACKAGE "PGLOADER.PARSER"> EXPORT PGLOADER.CATALOG:FIELD-NAME PGLOADER.CATALOG:FIELD-NAME PGLOADER.PARSER::FIELD-NAME)                       
0]

https://github.com/dimitri/pgloader/issues/897

zabbixを停止

systemctl stop zabbix-server.service
systemctl status zabbix-server.service

mysqlを起動

mysqlが起動していない場合は、起動する。

systemctl start mysqld.service
systemctl status mysqld.service

postgresを起動

postgresが起動していない場合は、起動する。

systemctl start postgresql-11.service
systemctl status postgresql-11.service

初期セットアップが完了していない場合、下記を実施。

sudo -u postgres /usr/pgsql-11/bin/initdb -D /var/lib/pgsql/data -X /var/lib/pgsql/data/pg_xlog --encoding=UTF8 --locale=ja_JP.UTF-8

postgresにzabbixのDB作成

* ユーザの作成
createuser -U postgres zabbix --pwprompt -S -R -D

* DBの作成
createdb -U postgres zabbix -O zabbix


※ -Oでオーナーをつけるのを忘れた場合は、下記コマンドで後からつける。

psql -U postgres -c"ALTER DATABASE zabbix OWNER TO zabbix"

* zabbixのテーブルを作成
zcat /usr/share/doc/zabbix-server-pgsql-*/create.sql.gz | psql -U zabbix zabbix

mysql→postgresへのマイグレーション

  • スキーマをPostgresの"public"に設定するためのスクリプトファイルを作成
$ vim /tmp/commands.load

    load database
       from mysql://root:root@localhost/zabbix
       into pgsql://postgres:postgres@localhost/zabbix
       alter schema 'zabbix' rename to 'public';
  • pgloaderでマイグレーション
* pgloaderでマイグレーション

build/bin/pgloader mysql://root:user_password@localhost/zabbix postgresql://postgres:user_password@localhost/zabbix

build/bin/pgloader /tmp/commands.load

* 結果確認
tail /tmp/pgloader/pgloader.log

* DBのエンコーディングを確認
mysql -u zabbix -pzabbix -e "SHOW CREATE DATABASE zabbix;"
psql -U postgres -l

* テーブル情報を確認
mysql -u root -ppassword -e "SHOW TABLES FROM zabbix;"
psql -U zabbix -d zabbix -c "\dt"

* ユーザ情報を表示
mysql -u root -ppassword -e "select host,user from mysql.user;"
psql -U zabbix -d zabbix -c "\du"

Zabbixの設定ファイルを修正

下記のようにconfファイルを変更。

$ vi /etc/zabbix/zabbix_server.conf

#DBSocket=/var/lib/mysql/mysql.sock
DBPort=5432
$ vi /etc/zabbix/web/zabbix.conf.php

# SELECT IBM_DB2, MYSQL, ORACLE, POSTGRESQL.
#$DB['TYPE']     = 'MYSQL';
$DB['TYPE']     = 'POSTGRESQL';
$DB['SERVER']   = 'localhost';
$DB['PORT']     = '5432';

Zabbixを再起動

systemctl start zabbix-server.service
systemctl status zabbix-server.service

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

pgloaderでMySQL→Postgresへの移行を行う

はじめに

pgloaderでMySQLで作成したZabbixのDBをPostgresにインポートする手順を記載する。

環境

  • CentOS 7.6
  • Zabbix 4.2
  • Postgres 11.5
  • MySQL 8.0

pgloaderのインストール

* gitのインストール
sudo yum install -y git


* インストールしたいディレクトリに移動
cd /usr/local/src

* インストール
git clone https://github.com/dimitri/pgloader.git
cd pgloader
chmod +x ./bootstrap-centos7.sh
sudo ./bootstrap-centos7.sh
make pgloader

下記のようなエラーが発生した場合は、10を入力し、
CONTINUEしたところ、正常にインストールされた。(インストールが正常に行われたかは不明)

...
[package pgloader.citus]..........................                                                                                                 [3537/4093]
[package pgloader.utils]                                                                                                                                      
debugger invoked on a NAME-CONFLICT in thread                                                                                                                 
#<THREAD "main thread" RUNNING {10005E85B3}>:                                                                                                                 
  EXPORT PGLOADER.CATALOG:FIELD-NAME causes name-conflicts in                                                                                                 
  #<PACKAGE "PGLOADER.PARSER"> between the following symbols:                                                                                                 
    PGLOADER.CATALOG:FIELD-NAME, PGLOADER.PARSER::FIELD-NAME                                                                                                  
See also:                                                                                                                                                     
  The ANSI Standard, Section 11.1.1.2.5                                                                                                                       

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.                                                                                              

restarts (invokable by number or by possibly-abbreviated name):                                                                                               
  0: [KEEP-OLD                     ] Keep PGLOADER.PARSER::FIELD-NAME accessible in PGLOADER.PARSER (shadowing PGLOADER.CATALOG:FIELD-NAME).                  
  1: [TAKE-NEW                     ] Make PGLOADER.CATALOG:FIELD-NAME accessible in PGLOADER.PARSER (uninterning PGLOADER.PARSER::FIELD-NAME).                
  2: [RESOLVE-CONFLICT             ] Resolve conflict.                                                                                                        
  3: [RETRY                        ] Retry                                                                                                                    
                                     compiling #<CL-SOURCE-FILE "pgloader" "src" "package">.                                                                  
  4: [ACCEPT                       ] Continue, treating                                                                                                       
                                     compiling #<CL-SOURCE-FILE "pgloader" "src" "package">                                                                   
                                     as having been successful.                                                                                               
  5:                                 Retry ASDF operation.                                                                                                    
  6: [CLEAR-CONFIGURATION-AND-RETRY] Retry ASDF operation after resetting the                                                                                 
                                     configuration.                                                                                                           
  7:                                 Retry ASDF operation.                                                                                                    
  8:                                 Retry ASDF operation after resetting the                                                                                 
                                     configuration.                                                                                                           
  9: [ABORT                        ] Give up on "pgloader"                                                                                                    
 10: [CONTINUE                     ] Ignore runtime option --eval "(ql:quickload \"pgloader\")".                                                              
 11:                                 Skip rest of --eval and --load options.                                                                                  
 12:                                 Skip to toplevel READ/EVAL/PRINT loop.                                                                                   
 13: [EXIT                         ] Exit SBCL (calling #'EXIT, killing the process).                                                                         

(NAME-CONFLICT #<PACKAGE "PGLOADER.PARSER"> EXPORT PGLOADER.CATALOG:FIELD-NAME PGLOADER.CATALOG:FIELD-NAME PGLOADER.PARSER::FIELD-NAME)                       
0]

https://github.com/dimitri/pgloader/issues/897

zabbixを停止

systemctl stop zabbix-server.service
systemctl status zabbix-server.service

mysqlを起動

mysqlが起動していない場合は、起動する。

systemctl start mysqld.service
systemctl status mysqld.service

postgresを起動

postgresが起動していない場合は、起動する。

systemctl start postgresql-11.service
systemctl status postgresql-11.service

初期セットアップが完了していない場合、下記を実施。

sudo -u postgres /usr/pgsql-11/bin/initdb -D /var/lib/pgsql/data -X /var/lib/pgsql/data/pg_xlog --encoding=UTF8 --locale=ja_JP.UTF-8

postgresにzabbixのDB作成

* ユーザの作成
createuser -U postgres zabbix --pwprompt -S -R -D

* DBの作成
createdb -U postgres zabbix -O zabbix


※ -Oでオーナーをつけるのを忘れた場合は、下記コマンドで後からつける。

psql -U postgres -c"ALTER DATABASE zabbix OWNER TO zabbix"

* zabbixのテーブルを作成
zcat /usr/share/doc/zabbix-server-pgsql-*/create.sql.gz | psql -U zabbix zabbix

mysql→postgresへのマイグレーション

  • スキーマをPostgresの"public"に設定するためのスクリプトファイルを作成
$ vim /tmp/commands.load

    load database
       from mysql://root:root@localhost/zabbix
       into pgsql://postgres:postgres@localhost/zabbix
       alter schema 'zabbix' rename to 'public';
  • pgloaderでマイグレーション
* pgloaderでマイグレーション

build/bin/pgloader mysql://root:user_password@localhost/zabbix postgresql://postgres:user_password@localhost/zabbix

build/bin/pgloader /tmp/commands.load

* 結果確認
tail /tmp/pgloader/pgloader.log

* DBのエンコーディングを確認
mysql -u zabbix -pzabbix -e "SHOW CREATE DATABASE zabbix;"
psql -U postgres -l

* テーブル情報を確認
mysql -u root -ppassword -e "SHOW TABLES FROM zabbix;"
psql -U zabbix -d zabbix -c "\dt"

※ zabbixのDBのテーブル情報を確認し、OWNERがzabbixでなかった場合は、ALTERでOWNERを変更する
https://qiita.com/YusukeHigaki/items/ea81633bd1ccac078c7c

* ユーザ情報を表示
mysql -u root -ppassword -e "select host,user from mysql.user;"
psql -U zabbix -d zabbix -c "\du"

Zabbixの設定ファイルを修正

下記のようにconfファイルを変更。

$ vi /etc/zabbix/zabbix_server.conf

#DBSocket=/var/lib/mysql/mysql.sock
DBPort=5432
$ vi /etc/zabbix/web/zabbix.conf.php

# SELECT IBM_DB2, MYSQL, ORACLE, POSTGRESQL.
#$DB['TYPE']     = 'MYSQL';
$DB['TYPE']     = 'POSTGRESQL';
$DB['SERVER']   = 'localhost';
$DB['PORT']     = '5432';

Zabbixを再起動

systemctl start zabbix-server.service
systemctl status zabbix-server.service

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む