- 投稿日:2019-10-23T23:50:55+09:00
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上記のようなエラーが出た場合は、
- ターミナルをいったん閉じる。
- Terminal -> Preferences -> Profiles -> Advanced
- 最下部の Set locale environment variables on startup のチェックを外す。
- もう一度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-develNode.jsをインストール
terminal$ sudo curl -sL https://rpm.nodesource.com/setup_6.x | sudo bash - $ sudo yum install nodejsrbenvと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.comunicorn導入
gemfilegroup :production do gem 'unicorn', '5.4.1' endconfig/unicorn.rb を作成。
config/unicorn.rbapp_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 -vterminal$ 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.ymlproduction: <<: *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回も初めからやり直すことに……解決法が分かり次第更新するが、もしこれを見て解決法が分かりそうな方は是非お力を貸していただきたいです!
- 投稿日:2019-10-23T20:42:29+09:00
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)
やり方
- 対象のカラムのcharsetとcollateを変更する
- プログラムの方でdbにアクセスする際にcharsetを utf8mb4 にする あとは
- テーブルのデフォルトの文字列を変更する
- データベースのデフォルトの文字列を変更する などの処理をしたほうが後々はいいが、ここでは割愛する(そんな全部絵文字対象ですか?ってこと + 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=utf82. 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
- 投稿日:2019-10-23T11:15:54+09:00
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 使用されているファイル形式の識別
- 投稿日:2019-10-23T09:41:46+09:00
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
- 投稿日:2019-10-23T09:12:51+09:00
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に仮想マシンを作成
- 仮想マシンの作成
- 名前: rails_test(任意)
- マシンフォルダー: (任意)
- タイプ: Linux
- バージョン: Red Hat (64-bit)
以降は任意で設定。今回はデフォルトのままで進めました。
仮想マシンが作成されたら、「設定」を押下します。
「システム」→「マザーボード」→「起動順序」のハードディスクの順序を一番上に持ってきてください。
これをしないと、OSインストール直後の再起動時にisoファイルが再読み込みされます。「ネットワーク」→「アダプター 2」で「ネットワークアダプターを有効化」にチェックを入れ、割り当てを「ホストオンリーアダプター」に設定。
OSインストール
赤色の枠を付けたところを設定します。
- 時刻と日付...アジア/東京
- ソフトウェアの選択...最小限のインストール
- インストール先...デフォルト
- ネットワークとホスト名...Ethernet(enp0s3), Ethernet(enp0s8)の接続を両方ONにする。
リリースノートによると、Virtual Boxを使用した上で「ソフトウェアの選択」がデフォルトのままだと問題があるようです。
ここまでできたら、インストールの開始をします。rootのパスワードを設定します。ユーザーは後で作成するのでここでは何もしません。
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 makeRuby・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 mysqldFirewallの設定
ポートの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 installproject/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: <<: *defaultI18n言語設定(必要であれば)
・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.rbmodule 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 endwebpackerのインストール
rails 6.0から必須になりました。
$ npm install -g yarn $ rails webpacker:installwebpackerでjs.erbを使用できるようにする
jsをerbで使用する方がほとんどだと思います。
$ bundle exec rails webpacker:install:erbサーバーの起動
jsをホットリロードしてくれるので、
$ bin/webpack-dev-serverを実行したあとにサーバー起動するのをおすすめします。
$ rails s -b 0.0.0.0終わりに
とりあえず以上で動くようにはなります。
あとは適宜設定していただければと思います。
ザーっと書きなぐったかんじなので、不足している点があればコメントいただければ幸いです。
- 投稿日:2019-10-23T00:05:41+09:00
【編集中】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
参考
- https://www.zabbix.com/jp/download?zabbix=4.0&os_distribution=ubuntu&os_version=bionic&db=PostgreSQL
- https://www.sraoss.co.jp/technology/zabbix/introduction/01-firststep.php
- https://pig-log.com/centos7-zabbix4-postgresql11-php73/
https://www.zabbix.com/forum/zabbix-help/375203-migration-from-mysql-to-postgres
https://pgloader.readthedocs.io/en/latest/tutorial/tutorial.html
- 投稿日:2019-10-23T00:05:41+09:00
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
参考
- https://www.zabbix.com/jp/download?zabbix=4.0&os_distribution=ubuntu&os_version=bionic&db=PostgreSQL
- https://www.sraoss.co.jp/technology/zabbix/introduction/01-firststep.php
- https://pig-log.com/centos7-zabbix4-postgresql11-php73/
https://www.zabbix.com/forum/zabbix-help/375203-migration-from-mysql-to-postgres
https://pgloader.readthedocs.io/en/latest/tutorial/tutorial.html







