20201115のMySQLに関する記事は11件です。

【Linux】Permission(アクセス権限)について

注意:この記事ではセキュリティに関する変更を加える記事になっております。この記事を元に発生した問題や損害に対しては、当方一切の責任を負いませんので、コマンドなどを実行する場合は必ず自己の責任が及ぶ範囲内でお願いいたします。

この記事で出てくる用語

file_put_contents() → PHPを実行した際に、指定されたパスのファイルに内容を加える。
file_get_contents() → PHPを実行した際に、指定されたパスのファイルの内容を呼び出す。
Permission → ディレクトリやファイルを操作する時の権限。(日本語で再帰的)


先日、PHPの学習をしている時に、file_put_contents()file_get_contents()を使用する場面があったのですが、そこでハマってしまったので解決方法を残しておきます。

結論から言うとPermissionの問題でした。



Permissionの確認方法

筆者が使っているのはMacOSなので、まずターミナルを開きます。その次にPermissionを確認したいディレクトリの1階層上まで移動し、下記のコマンドを入力します。

$ ls -la

するとディレクトリとファイルごとに、下記のような表記がずらっと出てきます。

drwxrwxrwx 1 username admin 1918 4 21 14:22 example.html

左端の列が、右端に表示されているディレクトリかファイルのPermissionを示しています。(それ以外はあまり気にしなくて大丈夫です。)
一番左側のdは複雑らしいので無視して、大切なのはrwxが3つ続いている部分になります。


  • 1つ目のrwxは、読み込みのアクセス権限
  • 2つ目のrwxは、書き込みのアクセス権限
  • 3つ目のrwxは、実行のアクセス権限



そして、rwxのそれぞれが示す権限は以下の通りです。

  • rは作成者
  • wは作成者グループ下の編集者
  • xは作成者でも編集者でも無い者(不特定多数)。




Permissionの変更方法(カレントディレクトリ下の全て)

無事にPermissonの確認を終えたら、いよいよ問題のディレクトリ、もしくはファイルのPermissionの変更をしていきます。
先ほど移動したカレントディレクトリのまま、以下のようなコマンドを実行します。

$ chmod 765

まずchmod(チェンジモード)を打ち込むことによって、Permissionの変更が可能な状態にします。そして次に任意の数字を入れて実行すれば、カレントディレクトリ下にある、全てのディレクトリとファイルのPermissionを変更することができます。


因みに任意の数字は以下のように決めることができます。

rwx rwx rwx r-- -w- --x rwx rw- r-x
 ↓    ↓    ↓   ↓  ↓  ↓   ↓   ↓   ↓
 7      7      7  4    2    1  7     6     5
        ↓       ↓        ↓
       777      421       765



表の真ん中の列を見てもらえればわかりやすいですが、rwxはそれぞれナンバリングがされています。


  • rは 4
  • wは 2
  • xは 1

そのため、rwxにしたい場合は 4+2+17 と計算することができます。
そしてrwxrwxrwxにしたい場合は 777777 と数字を打ち込めばOKです。


※ただし、上記で紹介している 777 は、誰でも読み込み、書き込み、実行ができてしまうと言う、セキュリティ上では非常に危険な状態となってしまう為、非推奨となります。


また、Permissionは作成者によって、何かしら必要な意味のある状態で保存されていることが多いので、試しに変更した場合は再度chmodを使用して、元のPermissionに戻しておくと良いでしょう。



Permissionの変更方法(指定したファイルのみ)

カレントディレクトリ下の全てのPermissionを変更するのではなく、こちらで指定して任意のディレクトリ、もしくはファイルのみのPermissionを変更したい場合は、以下のようなコマンドを実行します。

$ chmod 765 example.html

この場合、カレントディレクトリ下のexample.htmlPermission765 に変更することになります。

僕の場合は、このように1つだけファイルのPermissionを変更して、今回の問題だったfile_put_contents()file_get_contents()の実行をできるようにして、解決することができました。



まとめ

今回ご紹介したコマンドの一覧です。

$ ls -la
$ chmod 765
$ chmod 765 example.html

また繰り返しになりますが、Permissionの設定は、セキュリティと関わりのある大事な設定になりますので、変更する際は慎重に行ってください。


最後まで読んでいただき、ありがとうございました!

筆者:yuki|学習10日目で初案件獲得→現在はフルスタックエンジニア転職に向けて学習中
Qiita:https://qiita.com/yuki4839
Twitter:https://twitter.com/yuki35522891

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

権限(パーミッション)について

注意:この記事ではセキュリティに関する変更を加える記事になっております。この記事を元に発生した問題や損害に対しては、当方一切の責任を負いませんので、コマンドなどを実行する場合は必ず自己の責任が及ぶ範囲内でお願いいたします。

この記事で出てくる用語

file_put_contents() → PHPを実行した際に、指定されたパスのファイルに内容を加える。
file_get_contents() → PHPを実行した際に、指定されたパスのファイルの内容を呼び出す。
Permission → ディレクトリやファイルを操作する時の権限。(日本語で再帰的)


先日、PHPの学習をしている時に、file_put_contents()file_get_contents()を使用する場面があったのですが、そこでハマってしまったので解決方法を残しておきます。

結論から言うとPermissionの問題でした。



Permissionの確認方法

筆者が使っているのはMacOSなので、まずターミナルを開きます。その次にPermissionを確認したいディレクトリの1階層上まで移動し、下記のコマンドを入力します。

$ ls -la

するとディレクトリとファイルごとに、下記のような表記がずらっと出てきます。

drwxrwxrwx 1 username admin 1918 4 21 14:22 example.html

左端の列が、右端に表示されているディレクトリかファイルのPermissionを示しています。(それ以外はあまり気にしなくて大丈夫です。)
一番左側のdは複雑らしいので無視して、大切なのはrwxが3つ続いている部分になります。


  • 1つ目のrwxは、読み込みのアクセス権限
  • 2つ目のrwxは、書き込みのアクセス権限
  • 3つ目のrwxは、実行のアクセス権限



そして、rwxのそれぞれが示す権限は以下の通りです。

  • rは作成者
  • wは作成者グループ下の編集者
  • xは作成者でも編集者でも無い者(不特定多数)。




Permissionの変更方法(カレントディレクトリ下の全て)

無事にPermissonの確認を終えたら、いよいよ問題のディレクトリ、もしくはファイルのPermissionの変更をしていきます。
先ほど移動したカレントディレクトリのまま、以下のようなコマンドを実行します。

$ chmod 765

まずchmod(チェンジモード)を打ち込むことによって、Permissionの変更が可能な状態にします。そして次に任意の数字を入れて実行すれば、カレントディレクトリ下にある、全てのディレクトリとファイルのPermissionを変更することができます。


因みに任意の数字は以下のように決めることができます。

rwx rwx rwx r-- -w- --x rwx rw- r-x
 ↓    ↓    ↓   ↓  ↓  ↓   ↓   ↓   ↓
 7      7      7  4    2    1  7     6     5
        ↓       ↓        ↓
       777      421       765



表の真ん中の列を見てもらえればわかりやすいですが、rwxはそれぞれナンバリングがされています。


  • rは 4
  • wは 2
  • xは 1

そのため、rwxにしたい場合は 4+2+17 と計算することができます。
そしてrwxrwxrwxにしたい場合は 777777 と数字を打ち込めばOKです。


※ただし、上記で紹介している 777 は、誰でも読み込み、書き込み、実行ができてしまうと言う、セキュリティ上では非常に危険な状態となってしまう為、非推奨となります。


また、Permissionは作成者によって、何かしら必要な意味のある状態で保存されていることが多いので、試しに変更した場合は再度chmodを使用して、元のPermissionに戻しておくと良いでしょう。



Permissionの変更方法(指定したファイルのみ)

カレントディレクトリ下の全てのPermissionを変更するのではなく、こちらで指定して任意のディレクトリ、もしくはファイルのみのPermissionを変更したい場合は、以下のようなコマンドを実行します。

$ chmod 765 example.html

この場合、カレントディレクトリ下のexample.htmlPermission765 に変更することになります。

僕の場合は、このように1つだけファイルのPermissionを変更して、今回の問題だったfile_put_contents()file_get_contents()の実行をできるようにして、解決することができました。



まとめ

今回ご紹介したコマンドの一覧です。

$ ls -la
$ chmod 765
$ chmod 765 example.html

また繰り返しになりますが、Permissionの設定は、セキュリティと関わりのある大事な設定になりますので、変更する際は慎重に行ってください。


最後まで読んでいただき、ありがとうございました!

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

Permission(アクセス権限)について

注意:この記事ではセキュリティに関する変更を加える記事になっております。この記事を元に発生した問題や損害に対しては、当方一切の責任を負いませんので、コマンドなどを実行する場合は必ず自己の責任が及ぶ範囲内でお願いいたします。

この記事で出てくる用語

file_put_contents() → PHPを実行した際に、指定されたパスのファイルに内容を加える。
file_get_contents() → PHPを実行した際に、指定されたパスのファイルの内容を呼び出す。
Permission → ディレクトリやファイルを操作する時の権限。(日本語で再帰的)


先日、PHPの学習をしている時に、file_put_contents()file_get_contents()を使用する場面があったのですが、そこでハマってしまったので解決方法を残しておきます。

結論から言うとPermissionの問題でした。



Permissionの確認方法

筆者が使っているのはMacOSなので、まずターミナルを開きます。その次にPermissionを確認したいディレクトリの1階層上まで移動し、下記のコマンドを入力します。

$ ls -la

するとディレクトリとファイルごとに、下記のような表記がずらっと出てきます。

drwxrwxrwx 1 username admin 1918 4 21 14:22 example.html

左端の列が、右端に表示されているディレクトリかファイルのPermissionを示しています。(それ以外はあまり気にしなくて大丈夫です。)
一番左側のdは複雑らしいので無視して、大切なのはrwxが3つ続いている部分になります。


  • 1つ目のrwxは、読み込みのアクセス権限
  • 2つ目のrwxは、書き込みのアクセス権限
  • 3つ目のrwxは、実行のアクセス権限



そして、rwxのそれぞれが示す権限は以下の通りです。

  • rは作成者
  • wは作成者グループ下の編集者
  • xは作成者でも編集者でも無い者(不特定多数)。




Permissionの変更方法(カレントディレクトリ下の全て)

無事にPermissonの確認を終えたら、いよいよ問題のディレクトリ、もしくはファイルのPermissionの変更をしていきます。
先ほど移動したカレントディレクトリのまま、以下のようなコマンドを実行します。

$ chmod 765

まずchmod(チェンジモード)を打ち込むことによって、Permissionの変更が可能な状態にします。そして次に任意の数字を入れて実行すれば、カレントディレクトリ下にある、全てのディレクトリとファイルのPermissionを変更することができます。


因みに任意の数字は以下のように決めることができます。

rwx rwx rwx r-- -w- --x rwx rw- r-x
 ↓    ↓    ↓   ↓  ↓  ↓   ↓   ↓   ↓
 7      7      7  4    2    1  7     6     5
        ↓       ↓        ↓
       777      421       765



表の真ん中の列を見てもらえればわかりやすいですが、rwxはそれぞれナンバリングがされています。


  • rは 4
  • wは 2
  • xは 1

そのため、rwxにしたい場合は 4+2+17 と計算することができます。
そしてrwxrwxrwxにしたい場合は 777777 と数字を打ち込めばOKです。


※ただし、上記で紹介している 777 は、誰でも読み込み、書き込み、実行ができてしまうと言う、セキュリティ上では非常に危険な状態となってしまう為、非推奨となります。


また、Permissionは作成者によって、何かしら必要な意味のある状態で保存されていることが多いので、試しに変更した場合は再度chmodを使用して、元のPermissionに戻しておくと良いでしょう。



Permissionの変更方法(指定したファイルのみ)

カレントディレクトリ下の全てのPermissionを変更するのではなく、こちらで指定して任意のディレクトリ、もしくはファイルのみのPermissionを変更したい場合は、以下のようなコマンドを実行します。

$ chmod 765 example.html

この場合、カレントディレクトリ下のexample.htmlPermission765 に変更することになります。

僕の場合は、このように1つだけファイルのPermissionを変更して、今回の問題だったfile_put_contents()file_get_contents()の実行をできるようにして、解決することができました。



まとめ

今回ご紹介したコマンドの一覧です。

$ ls -la
$ chmod 765
$ chmod 765 example.html

また繰り返しになりますが、Permissionの設定は、セキュリティと関わりのある大事な設定になりますので、変更する際は慎重に行ってください。


最後まで読んでいただき、ありがとうございました!

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

東京リージョンのCloud SQLとUSリージョンのBigQueryをFederationする

BigQueryからCloud SQLに対してクエリを実行できる、Cloud SQL federated query機能はとても便利です。
この機能を活用すれば、Cloud SQLからBigQueryに対するETLを作成しなくても、簡単にBigQueryにデータを転送できます。
しかし、この機能はCloud SQLとBigQueryの2つが同一リージョンにある場合のみ使用することができます。
https://cloud.google.com/bigquery/docs/cloud-sql-federated-queries

では、東京リージョンのCloud SQLからUSマルチリージョンのBigQueryに対してクエリを実行したい場合はどうすればよいのでしょうか?

解決策

Cloud SQLのリージョン間レプリケーション機能を使い、USリージョンにリードレプリカを作成する。

例えば以下のようなDBインスタンスが東京リージョンにあったとします。

resource "google_sql_database_instance" "hoge-instance" {
  name             = "hoge"
  database_version = "MYSQL_5_7"
  region           = "asia-northeast1"

  settings {
    tier = "db-n1-standard-1"
    backup_configuration {
      binary_log_enabled = true
      enabled            = true
      start_time         = "17:00" # JST:02:00
    }
  }
}

この場合は、このようにアイオワリージョン(us-central1)にリードレプリカを作ることで、USリージョンのBigQueryとの連携が可能になります。

resource "google_sql_database_instance" "hoge-replication" {
  name                 = "hoge-replication"
  database_version     = "MYSQL_5_7"
  master_instance_name = google_sql_database_instance.hoge-instance.name
  region               = "us-central1"

  # プライマリーインスタンスが死んでも、このインスタンスにはフェイルオーバーさせない
  replica_configuration {
    failover_target = false
  }

  settings {
    tier = "db-n1-standard-1"
    backup_configuration {
      enabled = false
    }
  }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)のエラー

エラー内容

railsのアプリでデータベースを作成しようとしたところ、

$ bundle exec rake db:create
warning ../../../package.json: No license field
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
Couldn't create 'hello_rails_development' database. Please check your configuration.
rake aborted!
Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

のエラーが発生。

解決策

mysqlが起動できない(Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2))
https://qiita.com/carotene4035/items/e00076fe3990b9178cc0
の記事を参考にmysqlサーバーを再起動しました。

$ sudo mysql.server restart
Password:
Sorry, try again.
Password:
Sorry, try again.
Password:
sudo: 3 incorrect password attempts

しかし、Passwordが必要と言われ、MySQLのパスワードはとっくに忘れていたので、こちらの記事を参考にMySQLのパスワードを無しにしました。(本当ならrailsアプリのdatabase.ymlにパスワードを記述するべきですが。。。)
Mac ローカル環境の MySQL 8.x のrootパスワードを忘れた時のリセット方法
https://qiita.com/miriwo/items/1880e9d2ebcfd3c0e60d

$ mysql.server stop
$ mysqld_safe --skip-grant-tables &
$ mysql -u root
$ mysql.server status
$ kill [番号]
$ ps aux| grep mysqld
$ kill [番号]
$ mysql.server restart
$ bundle exec rake db:create

で無事にデータベースを作成できました。

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

Oracle MySQL Database Serviceのインポート・エクスポート

  • Oracle MySQL Database Serviceの使い方メモ〜その2
  • Oracle MySQL Database Serviceのインポート・エクスポート (mysqldump, MySQL Client, MySQL Workbench)

はじめに

Oracle Cloud Infrastructure (OCI) でマネージドサービスとして利用可能なOracle MySQL Database Serviceにおけるインポート・エクスポート操作を確認しました。Bastion (踏み台) サーバー上のmysqldumpとMySQL Clientを利用した場合と、クライアント環境のMySQL Workbenchを利用した場合を確認しました。結論はOracle MySQL Database Serviceにインポートする際にSET @@GLOBAL.GTID_PURGEDが含まれていると権限が足りないと怒られるので、エクスポートする際に--set-gtid-purged=OFFオプションを付与することがポイントです。

検証環境

  • MySQLバージョン : 8.0.22-u2-cloud (Oracle MySQL Database Service)
  • Oracle-Linux-8.2-2020.11.10-0 (OCI Compute VM) : Bastion (踏台) サーバとして利用
  • MySQL Ver 8.0.21 for Linux on x86_64 (Source distribution) : Bastionサーバ上のMySQL Clientとして利用
  • macOS 10.15.7 Catalina : クライアント環境
  • MySQL Workbench 8.0 Version 8.0.22 : クライアント上にインストール

OCI上の検証環境の構築方法は前回の記事を参照ください。
Oracle MySQL Database Serviceのインスタンスを作ってMySQL Workbenchから接続してみた

Bastionサーバ上でエクスポート・インポートを実施する

概要

Oracle MySQL Database Serviceインスタンスはプライベート・エンドポイントにアクセス可能なBastionサーバ上でmysqldump, MySQL Clientを実行し、Oracle MySQL Database Serviceにおけるインポート・エクスポートを行います。作業のイメージとしては下記のアーキテクチャ図を確認ください。エクスポートによるDumpファイルが生成場所、インポートのためのDumpファイルの配置場所はBastionサーバとなります。
20-11-15-13-53-20.png

失敗例

--set-gtid-purged=OFFオプション無しで失敗例を記します。Oracle MySQL Database Serviceインスタンス上のtestスキーマに対して下記エクスポート操作をBastionサーバ上で実施しました。

$ mysqldump --single-transaction --host [プライベートIPアドレス] -u [管理者ユーザー名] -p test > /tmp/mysqldump_test.dump
Enter password: 
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events. 

警告が出ますがDumpファイルは問題なく生成されています。

$ ls /tmp/mysqldump_test.dump
/tmp/mysqldump_test.dump

次にOracle MySQL Database Serviceインスタンスにインポートしてみます。

mysql --host [プライベートIPアドレス] -u [管理者ユーザー名] -p test < /tmp/mysqldump_test.dump
Enter password: 
ERROR 1227 (42000) at line 18: Access denied; you need (at least one of) the SUPER, SYSTEM_VARIABLES_ADMIN or SESSION_VARIABLES_ADMIN privilege(s) for this operation

管理者ユーザーに付与されている権限が不足しているとエラーがでて失敗します。

成功例

--set-gtid-purged=OFFオプションを付与してmysqldumpコマンドを実施します。

$ mysqldump --single-transaction --set-gtid-purged=OFF --host [プライベートIPアドレス] -u [管理者ユーザー名] -p test > /tmp/mysqldump_test.dump
Enter password: 

警告も表示されず、問題なく成功します。次にOracle MySQL Database Serviceインスタンスにインポートしてみます。

mysql --host [プライベートIPアドレス] -u [管理者ユーザー名] -p test < /tmp/mysqldump_test.dump
Enter password: 

インポートも問題なく実行できました。
mysqldumpのオプションについては公式マニュアルを確認ください。

クライアント上のMySQL Workbenchからのエクスポート・インポート

概要

Bastionサーバ経由でOracle MySQL Database Serviceにアクセスするように設定したクライアント環境上のMySQL Workbenchからインポート・エクスポートを行います。作業のイメージとしては下記のアーキテクチャ図を確認ください。エクスポートによるDumpファイルが生成場所、インポートのためのDumpファイルの配置場所はクライント環境となります。
20-11-15-12-55-24.png

MySQL Workbenchの接続方法については前回の記事を参照ください。

エクスポート操作

MySQL Workbench起動後に接続情報のタイルを選択し接続、画面左のManagementメニューよりData Exportメニューを選択します。画面右上のAdvanced Optionよりset-gtid-purged - Add 'SET @@GLOBAL.GTID_PURGED' to the outputの値をOFFに設定し、画面右上のReturnボタンを選択して元の画面に戻ります。
20-11-15-13-07-47.png

Table to Exportよりエクスポート対象となるスキーマとテーブルを選択してください。画面下部のExport to Dump Project FolderにDumpファイルの出力先のフォルダPATHを入力し、画面右下のStart Exportボタンを選択して、エクスポートを実行します。
20-11-15-13-19-03.png

インポート操作

画面左のManagementメニューよりData Exportメニューを選択します。Import from Dump Project FolderにインポートするDumpファイルが存在するフォルダPATHを入力します。画面下部の選択メニューより、インポート対象となるスキーマとテーブルを選択してください。画面右下のStart Importボタンを選択して、インポート操作を実行します。
20-11-15-13-26-58.png
20-11-15-13-29-40.png

関連情報

公式サイト
Oracle Cloud Infrastructure Documentation MySQL Database
MySQL 5.6 リファレンスマニュアル mysqldump — データベースバックアッププログラム

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

Homestead をアップデートしたい

アップデートの方法がどこにもないので、 box の最新版を追加し、 git のソースも最新化した (方法はこちら)。
ただし、この方法だとデータベースの中身が引き継がれない。
もし最新化する前であれば、普通に vagrant sshmysqldump するだけ。
ダンプの仕方を知りたい人は飛ばしてこちら

自分みたいにうっかり更新した後で、旧 Homestead のデータを取り出したいとなった人は次へ

データベース内容の引き継ぎ

  1. VirtualBox から旧 Homestead を直接起動
  2. GUI でログインする(login: vagrant, Password: vagrant)
  3. mysqldump する
  4. ホストのコンソールから scp で取り出す
  5. 旧 Homestead シャットダウンする
  6. 新 Homestead を vagrant up で起動する
  7. 先程のダンプファイルをゲストと共有しているフォルダに入れる
  8. vagrant ssh でゲストに入り、共有フォルダに移動する
  9. マイグレーションを実行する
  10. ダンプを mysql に流し込む

ダンプの仕方

データだけとる

大抵の人はマイグレーションを利用しているので、ダンプはデータだけ取れれば良いはず。
databasebk_databas.sql はそれぞれ自分に合ったものに変更する。

mysqldump -t `database_name` --ignore-table=migrations > bk_databas.sql

スキーマも一緒に

マイグレーションを利用していない場合は以下になる。
-t があるかどうかの違い。

mysqldump `database_name` > bk_databas.sql

最新化

  1. Homestead.yaml のバックアップ (例: cp Homestead.yaml Homestead.yaml.bk)
  2. vagrant box update
  3. git fetch
  4. git checkout release
  5. bash init.sh
  6. いくつか聞かれるが全部 y
  7. Homestead.yaml の差分を確認し、プロジェクトに必要なところを戻す
  8. デフォルトのPHPバージョンが変更になっている場合は、以前のやつに設定する (例: php72)

ライブラリとかは何もしなくてもそのまま引き継がれているはずなので、 composer とかは基本的にやらなくて良いはず。
自分のプロジェクトの PHP バージョンが分かっているのであれば、 Homestead.yamlsites ディレクティブで該当のプロジェクトに php: "7.2" と記載するのが良いと思う。

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

Oracle MySQL Database Serviceのインスタンスを作ってMySQL Workbenchから接続してみた

  • Oracle MySQL Database Serviceの使い方メモ〜その1
  • Oracle MySQL Database Serviceインスタンス作成とサービスコンソールの操作
  • Oracle MySQL Database Serviceインスタンスへの接続方法 (MySQL Shell, MySQL Client, MySQL Workbench)

はじめに

Oracle Cloud Infrastructure (OCI) でマネージドサービスとして利用可能なOracle MySQL Database Serviceの環境構築から基本操作、OCI上の踏台サーバ上で稼働するクライアントツールからの接続を試します。その後、統合ビジュアルツールであるMySQL Workbenchをクライアント環境にインストールして接続できることを確認しました。

検証環境

  • MySQLバージョン : 8.0.22-u2-cloud (Oracle MySQL Database Service)
  • Oracle-Linux-8.2-2020.11.10-0 (OCI Compute VM) : Bastion (踏台) サーバとして利用
  • MySQL Shell 8.0.22 : Bastionサーバ上で利用
  • MySQL Ver 8.0.21 for Linux on x86_64 (Source distribution) : Bastionサーバ上のMySQL Clientとして利用
  • macOS 10.15.7 Catalina : クライアント環境
  • MySQL Workbench 8.0 Version 8.0.22 : クライアント上にインストール

Oracle MySQL Database Serviceのインスタンスの構築

OCI上のネットワークの構成

Oracle MySQL Database Serviceインスタンスはプライベート・エンドポイントしか持たないため、プライベート・サブネット上に構築する必要があります。また、OCI外部からのプライベート・エンドポイントへの接続には閉域網接続 (FastConnect - Private Peering) または、インターネットVPN (IPSec) が必要となるため、インターネット経由で接続ができるようにパブリック・サブネット上にBastionサーバを構築します。VCNを新規作成する場合は、インターネット接続性を持つVCN作成ウィザードの利用が便利です。既存のVCNを利用する場合は、Bastionサーバが稼働するパブリック・サブネットとOracle MySQL Database Serviceインスタンスが稼働するプライベート・サブネットをそれぞれ1つずつ作成してください。下記は新規VCNを作る場合の作業について記します。

インターネット接続性を持つVCN作成ウィザード

OCIダッシュボードにログインし、OCIダッシュボードメニューから、コア・インフラストラクチャ>ネットワーキング>概要にアクセスし、画面中央の 「インターネット接続性を持つVCN作成」の「VCNウィザードの起動」を選択してください。
20-11-15-00-03-22.png

下記にウィザード内の入力例を記します。
* 基本情報
* VCN名 : 任意のVCN名 MySQLTest
* コンパートメント : 任意のコンパートメント名  /dev
* VCNとサブネットの構成
* VCN CIDRブロック 10.0.0.0/16
* パブリック・サブネットCIDRブロック 10.0.30.0/24
* プライベート・サブネットCIDRブロック 10.0.31/0/24
* DNS解決:(任意) 選択

ウィザードの全項目を入力し、VCNの関連するリソースの作成が終われば、下記の図のような構成のネットワークが作成されます。
20-11-15-00-23-01.png

セキュリティ・ルールの変更

パブリック・サブネットに配置するBastionサーバからプライベート・サブネットのOracle MySQL Database Serviceインスタンスはプライベート・エンドポイントにアクセスできるようにプライベート・サブネットのセキュリティ・ルールに3306および33060ポートの通信を許可するよう設定を追記します。(2020年11月時点ではセキュリティ・グループには対応していません)

OCIダッシュボードメニューから、コア・インフラストラクチャ>ネットワーキング>仮想クラウド・ネットワークにアクセスし、作成したVCN (本記事内ではMySQLTest) を選択、画面左下のリソースメニューよりセキュリティ・リストを選択、セキュリティ・リストの一覧よりプライベート・サブネット-VCN名のセキュリティ・リストを選択、画面中央のイングレス・ルールの追加ボタンをクリックし、下記の設定を追記してください。


ステートレス ソース・タイプ ソースCIDR IPプロトコル ソース・ポート範囲 宛先ポート範囲
いいえ CIDR 10.30.0.0/16 TCP All 3306
いいえ CIDR 10.30.0.0/16 TCP All 33060

OCI IAMのポリシーの追加

マニュアルを参考にOracle MySQL Database Serviceを利用するために必要なポリシーを設定します。

Allow group <グループ名> to manage mysql-family in compartment <コンパートメント名>
Allow service mysql to use all-resources in compartment <コンパートメント名>

筆者の環境では開発環境用に /dev コンパートメントと開発用のグループであるDevelopersが作成済で、DevelopersグループにはOracle MySQL Database Serviceを利用するIAMユーザーが追加されています。この様な環境で上記ポリシーは下記の様に書くことができます。

Allow group Developers to manage mysql-family in compartment dev
Allow service mysql to use all-resources in compartment dev

ポリシーの記載方法については、こちらの活用資料が参考になります。
Oracle Cloud Infrastructure 活用資料集 IDおよびアクセス管理 (IAM) 概要

Oracle MySQL Database Serviceインスタンスの作成

OCIダッシュボードメニューから、データベース>MySQLにアクセスします。
20-11-15-01-14-55.png

MySQL Databaseシステムの作成ボタンを押したいところですが、その前に画面左のリスト範囲メニューに表示されたコンパートメントのセレクタメニューより先程ポリシーを設定したコンパートメントに切り替えることを忘れないでください。それでは、MySQL Databaseシステムの作成ボタンを押してインスタンスの作成ウィザードを開始します。
20-11-15-01-16-10.png

ウィザード内の入力例を下記に示します。

  • DBシステムの基本情報の指定

    • コンパートメントの選択 : 任意のコンパートメント名  /dev 
    • DBシステムの名前 : 任意名前 mysqltest
    • 説明 : コメント記入
    • 可用性ドメインの選択 :デフォルト Fubk:AP-TOKYO-1-AD-1
    • フォルト・ドメインの選択 :デフォルト FAULT-DOMAIN-1
    • シェイプの選択:デフォルト  VM.Standard.E2.1
    • データ・ストレージ・サイズ(GB) : 最小50GB
    • メンテナンス・ウィンドウの開始時間 :  Sunday 18:00 (UTCで入力)
  • 管理者資格証明の作成

    • ユーザー名 MuSQL管理ユーザー名
    • パスワード MySQL管理者パスワード > 管理者パスワードは8文字から32文字までの長さで、大文字、小文字、数字および特殊文字をそれぞれ1つ以上含める必要があります
  • ネットワーク情報の指定

    • (コンパート名)の仮想クラウド・ネットワーク : VCNを作成したコンパート名を指定後、事前作成したVCN名入力
    • (コンパート名)のサブネット : サブネットを作成したコンパートを指定後、事前作成したプライベート・サブネット名を入力
    • ホスト名: 任意のホスト名 mysqldb
    • MYSQLポート : 3306
    • MYSQL Xプロトコル・ポート: 33060
  • DBシステム・バックアップの基本情報の指定:今回は利用しない

    • 自動バックアップの有効化 : 指定なし
    • バックアップ保有期間 (日数) : 指定なし
    • バックアップ・ウィンドウの開始時間 デフォルト・バックアップ・ウィンドウ / バックアップ選択ウィンドウ : 指定なし
    • バックアップ・ウィンドウの開始時間指定 : 指定なし

Bastionサーバ用のCompute VMインスタンスの作成

OCIダッシュボードメニューから、コア・インフラストラクチャ>コンピュート>インスタンスにアクセスします。インスタンスの作成ボタンを押してComputeインスタンスの作成ウィザードを開始します。
ウィザード内の入力例を下記に示します。

  • 名前 : 任意名前 Bastion
  • コンパートメントの選択 : 任意のコンパートメント名  /dev

  • 配置とハードウェアの構成

    • 可用性ドメインの選択 :デフォルト Fubk:AP-TOKYO-1-AD-1
    • フォルト・ドメインの選択 :デフォルト  FAULT-DOMAIN-1
    • イメージ:Oracle Linux 8
    • シェイプの選択:デフォルト  VM.Standard.E2.1
  • ネットワーキングの構成

    • 仮想クラウド・ネットワーク: MySQLTest
    • サブネット: パブリック・サブネット-MySQLTest
    • ネットワーク・セキュリティ・グループを使用してトラフィックを制御: いいえ
    • パブリックIPv4アドレスの割当て: はい
  • SSHキーの追加:公開キー・ファイルの選択

  • ブート・ボリュームの構成 :デフォルト設定

作成した検証環境構成

これまで作成したシステム構成のアーキテクチャは下記のようになっているはずです。
20-11-15-01-54-48.png

これでOracle MySQL Database Serviceを利用する準備が完了です。

Oracle MySQL Database Serviceコンソールの操作

Oracle MySQL Database Serviceコンソール画面からできることを説明します。まずは、画面中央のアクションメニューから見ていきます。

20-11-15-02-41-29.png

編集

表示名、説明、メンテナンスウィンドウの開始時間の変更ができます。
システム変数の編集はここからはできません。アトミテック社の記事にシステム変数の変更方法の手順が紹介されています。

起動

停止中のインスタンスを起動できます。

停止

起動中のインスタンスを停止できます。

再起動

起動中のインスタンスを再起動できます。

その他のアクション

  • バックアップ構成の編集 : 自動バックアップ構成の設定編集が可能です
  • アナリティックス・クラスタの追加 : 後述
  • タグの追加 : リソースの識別を行うタグを追加できます
  • 削除 : インスタンスの削除を行います

20-11-15-02-40-09.png
次に左下のリソースメニューです。

メトリック

Oracle MySQL Database ServiceインスタンスのMonitoringメトリックをグラフで確認できます。確認できるメトリックの種類はマニュアル に記載されています。

エンドポイント

ホスト名、プライベートIPアドレス、MYSQLポート、MYSQL Xプロトコル・ポートを確認することができます。

アナリティクス・クラスタ

アナリティクス・クラスタの追加、アナリティクス・クラスタの情報確認ができます。マニュアルを確認すると、アナリティクス・クラスタを利用することで、分析クエリをオフロードし、MySQL Analytic Engineを利用した高速処理が可能になります。MySQL Analytic Engineは、分析クエリの高速実行を目的として設計された、分散型、スケーラブル、共有型、ナッシング、インメモリ、カラム型のクエリ処理エンジンとのこと。非常に魅力的で是非試したかった機能ですが、マニュアルに下記記載を見つけて断念。(2020年11月に確認, 最小構成で2node必要とのこと・・・)

Note: Currently, only BM.Standard.E2.64 is supported.

バックアップ

自動バックアップ構成の編集、手動バックアップの作成の取得をおこなうことができます。バックアップの仕様はこちらを確認。

Oracle MySQL Database Serviceのインスタンスへの接続

Bastionサーバを経由で、MySQL Shell、MySQL Client、MySQL Workbenchを利用した接続方法について確認します。

MySQL Shell

BastionサーバにSSHクライアントからアクセスします。macOSの場合はターミナルから下記コマンドを実行して接続します。

ssh -i [秘密鍵のパス] opc@[BastionサーバのパブリックIPアドレス]

次に下記コマンドでBastionサーバ上にMySQL Shellをインストールします。

sudo yum install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
sudo yum install mysql-shell

Oracle MySQL Database Serviceインスタンスを作成した際に設定した管理者ユーザー名と、サービス・コンソール画面から確認できるエンドポイントのプライベートIPアドレスを指定してMySQL Shellを起動します。起動時に入力が求められるパスワードはOracle MySQL Database Serviceインスタンス作成ウィザード内で設定したパスワードです。

$ mysqlsh [管理者ユーザー名]@[プライベートIPアドレス]
Please provide the password for '[管理者ユーザー名]@[プライベートIPアドレス]': **************
MySQL Shell 8.0.22

Copyright (c) 2016, 2020, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.

Type '\help' or '\?' for help; '\quit' to exit.
Creating a session to 'etatsu@10.0.31.3'
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 13 (X protocol)
Server version: 8.0.22-u2-cloud MySQL Enterprise - Cloud
No default schema selected; type \use <schema> to set one.
 MySQL  [プライベートIPアドレス]:33060+ ssl  JS > 

MySQL Client

BastionサーバにSSHクライアントからアクセスし、下記コマンドでBastionサーバ上にMySQLをインストールします。

sudo yum install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
sudo yum install mysql

Oracle MySQL Database Serviceインスタンスを作成した際に設定した管理者ユーザー名と、サービス・コンソール画面から確認できるエンドポイントのプライベートIPアドレスを指定してMySQLクライアントを起動します。起動時に入力が求められるパスワードはOracle MySQL Database Serviceインスタンス作成ウィザード内で設定したパスワードです。

$ mysql --host [プライベートIPアドレス] -u [管理者ユーザー名] -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 8.0.22-u2-cloud MySQL Enterprise - Cloud

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

MySQL Workbench

(公式サイト)[https://www.mysql.com/jp/products/workbench/]
の画面中央の「ダウンロードはこちら」からダウンロードページに移動、ダウンロード(要ORACLEアカウント)後、インストールを行ってください。OS環境に応じてインストールウィザードを完了後、MySQL Workbenchを起動すると下記のような画面が表示されます。
20-11-15-03-19-15.png

画面中央のMySQL Connectionsの横の+ボタンから接続情報の作成を行います。設定方法は下記を参考にしてください。
20-11-15-03-20-07.png

設定項目の入力後、Test Connectionボタンを選択すると下記のようなメッセージが表示されれば成功です。
20-11-15-03-23-32.png

OKボタンを選択すればMySQL Workbenchへの接続が完了です。
起動後の画面に接続情報が書かれたタイルが追加されるので、次回以降接続設定なしでタイルを選択するだけでOracle MySQL Database Serviceインスタンスに接続することができます。
20-11-15-03-27-39.png

なお、MySQL WorkbenchではSQLを実行するだけでなく、稼働状況の確認やデータのエクスポート・インポートも可能です。最後にMySQL Workbenchのスクリーンショットを掲載します。

20-11-15-03-31-10.png
20-11-15-03-43-32.png
20-11-15-03-43-52.png

関連情報

公式サイト
Oracle Cloud Infrastructure Documentation MySQL Database
[スマートスタイル社 技術ブログ] MySQL Database Service のインスタンスを作成してみる
[アトミテック社 ブログ] Oracle Cloud(OCI)ついにPaaSのMySQL(MySQL Database Service)が登場!
[Qiita] [Oracle Cloud] MySQL Database Service の Getting Started をやってみた
[Qiita] [Oracle Cloud] MySQL Database Service でモニタリング監視をしてみた
MySQL Database Serviceを触るまでのお話

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

Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)の解決まで。

原因:

helokuのMysqlとデプロイ使用しているデータベースが紐付けられていなかったため。

確認したこと

heroku info

実行後、データベースの環境変数を確認

CLEARDB_DATABASE_URL:     mysql://xxxxxxxxxxxx
CLEARDB_DATABASE_GREEN:   mysql://xxxxxxxxxxxx
LANG:                     en_US.UTF-8
RACK_ENV:                 production
RAILS_ENV:                production
RAILS_LOG_TO_STDOUT:      enabled
RAILS_SERVE_STATIC_FILES: enabled
SECRET_KEY_BASE:

あるはずのDATABASE_URL:がないし、mysql2でデータベース作ったはずなのに反映されてない・・・。

結論:

これは、ターミナルで

heroku config:set DATABASE_URL=mysql2${heroku_cleardb:5}

の入力がなく、mysql2のデータベースに環境変数を格納できていなかったため。

最後に:

環境変数を変更するため、herokuのHPのアプリのページへ遷移し、settingsをクリック。

画面中央のReveal Config Varsをクリック。Config Varsを編集して終了。

無事、

heroku run rake db:migrate

出来ました!

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

オンプレDBサーバ(MySQL)のデータをRDSに移行する方法

What's this?

サーバのAWS移設で、DBのデータをRDSに持っていった際の備忘です。
気をつけるべきポイントは以下の通りです。

  • RDSではrootを使用できない
  • 多くの場合直接RDSに接続でいないため、対向サーバ(今回の場合EC2)を経由させる必要がある

注意

取得したダンプファイルはmy_databases_yyyyMMdd.sqlで表しています。
Mysqlは5.7系です

手順

①オンプレの方のフルダンプを取得する

> mysqldump --password=■■■ --skip-add-drop-table --single-transaction --databases 【ダンプ取得対象のDB】 > my_databases_yyyyMMdd.sql

新規の(まっさらな)RDSに反映させる前提なので--skip-add-drop-tableをつけてDROP TABLEステートメントを省略しています。
またデータの整合性を保つために--single-transactionを付与しております。

②sqlデータを置き替える

RDSではrootは取れないので、代わりにadminに修正します。

> sed -i -e 's/DEFINER=`root`@`localhost`/DEFINER=`admin`@`%`/g' my_databases_yyyyMMdd.sql

③sqlデータをzip化する

> zip -e --password=【パスワード】 my_databases_yyyyMMdd.zip my_databases_yyyyMMdd.sql

④zipデータをローカルに取得する

WinSCPなりなんだりでよしなに取得してください

⑤データをEC2サーバに上げる

今回の場合、ローカルからS3にアップし、EC2からS3にアップしたファイルを引き上げてます

> aws s3 cp s3://tmp/my_databases_yyyyMMdd.zip .

⑥zipデータを解凍する

# unzip -P 【パスワード】 my_databases_yyyyMMdd.zip

⑦RDSにデータを突っ込む

# mysql -h 【RDSエンドポイント】 -u admin -p < my_databases_yyyyMMdd.sql
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【業務未経験・独学】自社開発企業様から内定をもらうまでのお話

筆者のプロフィール

プログラミング歴三年弱
独学

どのくらい応募したか

エージェントの経由での応募も含めるとだいたい70−80社ほど。そのうち書類通過は15社くらい。
内定は3社いただきました。(1社は自社開発ではないです。)
選考途中のものは全てお断りしたのでもしかしたらもう1−2社くらい内定いただけかもしれないです。
就活期間 2020年10月初旬〜2020年11月中旬の1ヶ月ちょい

概要

社内で管理しているエクセルファイルとかを勝手にVBAで自動化するうちにプログラミングが楽しくなり、WEB系エンジニアにジョブチェンジ

具体的な学習方法

基本ほぼ全てアウトプットをベースに学習しました(最近はインプットもするように心がけています。)
なので最初に必ずやりたいことがあってそれを実現する方法を調べるという手順になります。

※途中から学習方法というよりは私がプログラミングができるようになるまでの過程になってます。なんか初学者の方のヒントになればとは思います。

★具体例
エクセルで毎回毎回同じフィルターかけるのめんどくさいからボタンを何個か設置してよく使うフィルターはボタン押したら発動するようにしたいわ
と思ったとします。
学習の初期の初期段階を想定すると分からないことというのは以下の通りだと思います。(基本的なエクセルの使い方はわかっている想定です。)

1.ボタンってどうやって設置すんの?
2.プログラムってどこに書くの?
3.そもそもプログラミング分からん

こんな感じかと思います。
ということでそもそもプログラムする前に解決すべき問題がプログラムをどこに書くのか、そしてボタンの設置方法ということが分かります。
なのでまずそれを調べます。

実際私がこのあとにとった行動はとりあえずマクロの記録をしてそれをボタンを押したら呼べるようにするということをしました。(マクロの記録とは記録中にマウスやキーボードで操作した手順を記憶して実行させることができる機能です。もちろんマクロの記録の仕方も最初は分からないので調べます。)

ここまででとりあえずボタンを設置してプログラムを走らせるところまでは分かりました。

次は記録したマクロを編集する方法を調べます。そうすれば自ずとどこにプログラミングを書けばいいかも分かります。
編集の仕方を調べたらちょっといじってみます。
例えば"田中"という名前でフィルターをするマクロを記録したとしたらこんな感じのコードが出力されていたとします。

    Selection.AutoFilter
    ActiveSheet.Range("$A$1:$B$5").AutoFilter Field:=1, Criteria1:="田中"

そうするとあーこれ"田中"の部分を自分の好きな文字に変えたらいいんじゃね?
となると思います。
かなりざっくりですが最初はそんな感じのことをひたすら繰り返してました。
とりあえず近い動きのマクロの記録して実際やりたい動きにするにはどこの数字や文字をいじれば良さそうかなーと考えて適当に触りまくります。
この時点ではもう細かいことは全て無視です。デバックの仕方もしらないのでひたすらコードを編集したら保存してボタンを押して実行、エラーがでたらまた編集そんな感じです。

一見効率が悪いように思えるかもしれませんが自分がやりたいことを最短で実現できるため、自分の書いたプログラムが動くことの楽しさを最短で味わうことができ挫折の確率は下がるのではないかと思います。

そんなこんなで動いたソースコードをひたすらコピペしまくるだけで一通り自分のやりたいことが実現できるスーパーコピペプログラマーになりましたとさ
ただそんなことばかり繰り返しているものだから半年以上は関数を一切使わずにVBAをぶん回していました記憶があります。(関数の存在は知っていたのですがイマイチ必要な理由が分からない+戻り値と返り値が理解できないので使えない)
そんな感じで半年以上続けているとコードを改修する機会も多くなり、スーパーコピペプログラマーとして名を馳せていた私はある日同じ処理が10箇所くらい存在していることに気がつきました。(もっと早く気付け)

その瞬間、関数の必要性が分かったんです。そして同時に今まで戻り値、返り値が理解出来なかったのが不思議なくらい分かったんです。
それに衝撃を受け私はしばらくリファクタリングにハマりました。どんどんコードが短くなり、保守性が高くなっていく感覚、リファクタリングが最高に楽しくなりました。

そうして一年くらいの時を経て私はついに【関数】を会得しました。
それからWEBアプリケーションの世界に進んでいくのでした。

WEBアプリケーションになってもやることは同じです。作りたいものを決めそれを作るために分からないことを調べる。少しずつそれをやってみる。最初は意味も分からずコピペしまくる。気にしない。動くことを最優先。それを繰り返していくとふと、今までコピペしていた内容が分かる瞬間がきます。
それが成長の時ではないでしょうか。

現在のスキル

そんなこんなでプログラミングを始めてから3年弱が過ぎもっとつよつよなプラグラマーになりたいと強く思い転職活動を始めました。
活動期間は冒頭に書いてます。

開発に使用した言語、技術
HTML/CSS(scss,bootstrap)/PHP/Python/Ruby(Ruby on Rails)/JavaScript(Vue.js,JQuery)/VBA/DB(MS SQL,PostgreSQL,MySQL)/AWS(EC2,S3,Route53)/さくらVPS/centOS7/Nginx/Apache/Ajax/docker/git

もちろんひとつひとつのスキルは大したことはないですが上記のような技術を組み合わせて一応WEBアプリケーションはイチから作りたいものは作れるようなレベルにはなりました。

作ったもの

・売上、在庫、経費管理アプリ
・ホームページ(PHPでフルスクラッチ)

ポートフォリオは?

残念ながら現在も社内で稼働していて色々パスワード等ベタ書きしてるところもあり、ソースは公開しておらず、書類選考時にはYoutubeのURLを貼ってなんとなくWEBアプリケーション全体の動きが分かるようにはしてあります。

就活の感想

面接官がエンジニアじゃなくて技術の知識がない人事だといまいち今まで身につけたスキルが評価されずいわゆる面接中のコミュニケーションが上手いかどうかで判断されがちで辛いことがありました。
面接する方が技術者だと話が弾むこともあって楽しい傾向にあります。

これからプログラミング始める方へ

小さなものでいいのでまず自分の作りたいものから作ってみてください。
特にExcelのVBAとスプレッドシートのGASは環境構築もいらないですし現在の業務で使ってる可能性が非常に高いのでおすすめです。
自分の作りたいものができた時初めてプログラミングって楽しい。そう感じると思います。
給料が良さそうだからとかフリーランスで自由に働きたいとかリモートワークがいいとかおそらくそういった動機でプログラミングで始められる方はほとんど挫折すると思います。
プログラミングは目的ではなく金を稼ぐ為の手段という人もいますがもちろんそういった側面があることも否めませんがもっと単純に、楽しいからやる。
そういった人がもっと社会全体で増えて来るともっと面白い未来が見えてくると思います。

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