- 投稿日:2020-11-18T23:21:03+09:00
商品マスタの全ての商品を持つ店舗を取得する
以下のテーブルがある
select * from items; +--------------+ | item | +--------------+ | ビール | | 紙オムツ | | 自転車 | +--------------+select * from shopitems; +--------+--------------+ | shop | item | +--------+--------------+ | 仙台 | カーテン | | 仙台 | ビール | | 仙台 | 紙オムツ | | 仙台 | 自転車 | | 大阪 | テレビ | | 大阪 | 紙オムツ | | 大阪 | 自転車 | | 東京 | ビール | | 東京 | 紙オムツ | | 東京 | 自転車 | +--------+--------------+shopitemsテーブルでshopテーブルの全てのitemを持つshopを取得する。(仙台、東京)
select si.shop from shopitems si ,items i where si.item = i.item group by si.shop having count(si.item) = ( select count(item) from items ); +--------+ | shop | +--------+ | 仙台 | | 東京 | +--------+仙台にはitemsテーブルにないカーテンもある状態。
仙台を除く場合は以下。select si.shop from shopitems si left outer join items i on si.item = i.item group by si.shop having count(si.item) = ( select count(*) from items ) and count(i.item) = ( select count(*) from items );こちらを参考にさせていただきました。
達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ
- 投稿日:2020-11-18T21:35:05+09:00
データベースクライアントツールから多段SSHでデータベースに接続したい
やりたいこと
こんな感じの踏み台が複数ある多段のSSHでデータベースに接続しに行く構成で、
手元のWindows 10クライアントにインストールしたデータベースクライアントツール(Oracle SQL DeveloperとかMySQL Workbench)から直接DBを見に行きたい。SSHポートフォワーディング
データベースクライアントツールからは一段までしか踏み台ができないため、SSHポートフォワーディングを実行して、ローカルクライアントのポートをデータベースに間接的に接続します。
便宜的に各サーバの接続情報を定義します。
ホスト IPアドレス/ドメイン ポート EC2(Bastion) AAA.AAA.AAA.10 22 EC2(Web/AP) BBB.BBB.BBB.11 22 RDS(Oracle) oracle.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com 1521 RDS(MySQL) mysql.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com 3306 ユーザーディレクトリ直下に
.ssh
フォルダを作成。
中にポートフォワードの設定ファイルを作成します。.ssh\configHost bastion hostname AAA.AAA.AAA.10 port 22 user ec2-user IdentityFile C:\Users\hoge\.ssh\bastion.pem Host webap/oracle hostname BBB.BBB.BBB.11 port 22 user ec2-user IdentityFile C:\Users\hoge\.ssh\webap.pem ProxyCommand C:\Windows\System32\OpenSSH\ssh.exe bastion -W %h:%p GatewayPorts yes LocalForward 51521 oracle.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com:1521 Host webap/mysql hostname BBB.BBB.BBB.11 port 22 user ec2-user IdentityFile C:\Users\hoge\.ssh\webap.pem ProxyCommand C:\Windows\System32\OpenSSH\ssh.exe bastion -W %h:%p GatewayPorts yes LocalForward 53306 mysql.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306パスワード認証の時は
IdentityFile
の行は指定しなくて大丈夫です。
ssh webap/oracle
やssh webap/mysql
でポートフォワーディングした先のWeb/APサーバーにSSH接続が成功すればひとまずOK。>ssh webap/oracle The authenticity of host 'BBB.BBB.BBB.11 (<no hostip for proxy command>)' can't be established. ECDSA key fingerprint is SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'BBB.BBB.BBB.11' (ECDSA) to the list of known hosts. Last login: Wed Nov 18 20:13:03 2020 from ip-BBB-BBB-BBB-11.ap-northeast-1.compute.internal __| __|_ ) _| ( / Amazon Linux 2 AMI ___|\___|___| https://aws.amazon.com/amazon-linux-2/ [ec2-user@ ~]$上記のコマンドでデータベースへの経路を確立していないとクライアントツールから接続できないので、使うときはターミナルから事前に接続して開きっぱなしにしておきましょう。
クライアントツールからデータベースに接続
ポートフォワーディングしたローカルポートから接続します。
Oracle SQL Developer
MySQL Workbench
- 投稿日:2020-11-18T21:03:55+09:00
Raspberry Pi4(Ubuntu server20.04)でDockerを動かす勘所
初めに
ここに書いたのは、あくまでも2020年11月28日現在の話。Raspberry Pi上のDocker環境は激しく変わる。
Raspberry Pi OSの64bitはまだβ版。しかし64bitしかサポートしないアプリが増えているのでUbuntuを使う。
dockerは公式の最新を使う
ディストリビューションからインストールされるバージョンは大抵古いので、Docker公式のレポジトリを登録して使う。
https://docs.docker.com/engine/install/ubuntu/
$ sudo apt-get update $ sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - $ sudo apt-key fingerprint 0EBFCD88 $ sudo add-apt-repository \ "deb [arch=arm64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable" $ sudo apt-get update $ sudo apt-get install docker-ce docker-ce-cli containerd.iodocker-compseを入れる
docker-compseは、公式からARM版バイナリが公開されていません。
自力でコンパイルpip3でインストール。$ sudo apt-get install libffi-dev libssl-dev $ sudo apt-get install python3 python3-pip python3-dev $ sudo pip3 install docker-compose
- Python3はデフォルトでインストールされているかも
MySQL
- NG(イメージがダウンロード出来ない)
$ docker pull mysql
- OK
$ docker pull mysql/mysql-serverdocker-compose.ymlで image:mysqlと書いてある部分は、mysql/mysql-serverに置き換える(挙動はあまりかわらない)
- 両者の違いは前者はDocker公式(debian base)で、後者がOracle公式(Oracle Linux base)みたい。
phpmyadmin
- 動かなっかった AMD64版を動かそうとしていたみたい。
$ docker run phpmyadmin/phpmyadminexec user process caused "exec format error" dockerエラーがでてコケた。
- 動いた
$ docker run arm64v8/phpmyadmin
- 公式イメージが動かなければ https://hub.docker.com/u/arm64v8 を調べると良いかも。
jwilder/nginx-proxy
これも動かない。
Dockerfileを見ると同梱するツールがamd64版をハードコードされていた。一緒に入れているツールのarm64版をコンパイルする必要がありそうなので取りあえずパス。
- 投稿日:2020-11-18T19:52:23+09:00
Djangoでフォロー機能を実装する
前段
SNS系アプリにほぼ必須のフォロー機能をDjangoで実装しました。
ライブラリ不使用の自前実装になります。
各自用途や要件に合わせてカスタマイズしてください。開発環境
- Django
- Python 3.8.5
- MySQL
- Visual Studio Code
※SQLite3でもほぼコード変更なしで書けます。
フォロー機能の具体的な要件
- フォローすることができる/解除もできる
- 自分自身をフォローすることはできない
- フォロー数、フォロワー数を確認できる
フォロワーの一覧表示などはここでは省きます。
必要最小限の機能要件を実装します。テーブル設計
テーブルを1つだけ作成して済ましてしまう方法もありますが、個人的にSQL文が冗長になったり、テーブル管理がしにくい印象を持ったので今回は2つ用意します。
follow_relationテーブル
データ 格納する情報 データ型 user_id フォローする側のユーザーID UUID followed_id フォローされる側のユーザーID UUID follow_countテーブル
データ 格納する情報 データ型 user_id ユーザーID UUID follow フォローしている数 INT followed フォローされている数 INT
follow_relation
テーブルは、ユーザー間のフォロー状態の管理、follow_count
テーブルはユーザーのフォロー数、フォロワー数の管理をしています。views.pyの編集
テーブルができたらさっそくフォロー機能を実装していきましょう。
フォロー機能のおおまかな流れは以下のようになります。ページのリクエスト ↓ followd_status関数にてフォロー状態を確認&表示 ↓ フォローボタンを押す ↓ follows関数がフォロー状態に応じて処理 ↓ 元のページにリダイレクトでは以下コードになります。
followed_status関数@login_required def followed_status(request, accesskey): # 省略 # 各自必要なパラメータを取得してください # データベースへの接続 connection = MySQLdb.connect( host='localhost', user='***', passwd='***', db='***', charset="utf8" ) # カーソルの取得 cursor = connection.cursor() # クエリのセット follow_relation = "SELECT COUNT(*) FROM follow_relation where user_id = UUID_TO_BIN(%s) and followed_id = UUID_TO_BIN(%s);" # クエリの実行 # user_id、followed_idは各自で取得 cursor.execute(follow_relation, (user_id, followed_id)) row_follow = cursor.fetchone() follows = row_follow[0] # ログインユーザーとページユーザーが同一人物か判定 # 同一人物ならフォローできないようにします if followed_id == user_id: followed_status_code = 1 else: followed_status_code = 2 # もしfollowsが0より大きかったらTrue # followsが0だったらFalseを返す followed = False if follows > 0 : followed = True return followed_status_code, followed必要なパラメータは各自別テーブルから引き出してください。
今回必要なのはフォローする側とされる側のIDのみです。
user_id
がフォローする側、followed_id
がフォローされる側です。
- ユーザー同士のIDを照合します
ステータスコードを付与して同一人物か判別します。
followed_status_code = 1
なら自分自身(フォローできない)
followed_status_code = 2
なら他人同士(フォローできる)になります。
- フォロー状態を確認します
TrueとFalseでフォロー状態を確認します。
False
ならまだフォローしていない
True
なら既にフォローしているになります。
では、次にfollows関数を見ていきます。follows関数@login_required def followes(request, accesskey): # 省略 # 各自必要なパラメータを取得してください # データベースへの接続 connection = MySQLdb.connect( host='localhost', user='***', passwd='***', db='***', charset="utf8" ) # カーソルの取得 cursor = connection.cursor() # 共通クエリをセットしてください # ここで必要な情報を取得しておきます # 自分自身はフォローできないようにする if user_id == followed_id: followed = False # セッションにフォロー状態を保存します request.session['page_followed_status'] = followed else: if followed == False: # フォローするときの処理になります # クエリのセット # 新規フォロー関係の挿入 follow_reation = "INSERT INTO follow_relation (user_id, followed_id) values(UUID_TO_BIN(%s), UUID_TO_BIN(%s));" # フォローする側ユーザーのフォロー数を1つ増やす follow_update = "UPDATE follow_count SET follow = follow + 1 where user_id=UUID_TO_BIN(%s);" # フォローされる側ユーザーのフォロワー数を1つ増やす followed_update = "UPDATE follow_count SET followed = followed + 1 where user_id=UUID_TO_BIN(%s);" # クエリの実行 cursor.execute(follow_relation, (user_id, followed_id)) cursor.execute(follow_update, (user_id, )) cursor.execute(followed_update, (followed_id, )) # 接続を終了する cursor.close() connection.commit() connection.close() # フォローした状態にする followed = True request.session['page_followed_status'] = followed else: # フォローを外すときの処理になります # クエリのセット # フォロー関係の削除 follow_relation = "DELETE FROM follow_relation where user_id=UUID_TO_BIN(%s) and followed_id = UUID_TO_BIN(%s);" # フォローを外す側ユーザーのフォロー数を1つ減らす follow_update = "UPDATE follow_count SET follow = follow - 1 where user_id=UUID_TO_BIN(%s);" # フォローを外される側ページユーザーのフォロワー数を1つ減らす followed_update = "UPDATE follow_count SET followed = followed - 1 where user_id=UUID_TO_BIN(%s);" # クエリの実行 cursor.execute(sql_followrelation_delete, (user_id, followed_id)) cursor.execute(sql_follow_update, (user_id, )) cursor.execute(sql_followed_update, (followed_id, )) # 接続を終了する cursor.close() connection.commit() connection.close() # フォローしていない状態にする followed = False request.session['page_followed_status'] = followed return redirect('元のページ', accesskey)こちらはif文で分岐させてフォローするorフォロー解除の実際の処理をおこなっています。そして最後にフォローの状態を切り替えています。元のページにリダイレクトして終了です。(今回はAjaxなどを使用しないためページ遷移が生じています)
最後に表示用のviewを編集します。
result関数@login_required def result(request, accesskey): # 省略 # フォローの状態を把握する status = followed_status(request, accesskey) followed_status_code = status[0] followed = status[1] # フォローの状態をセッションに保存(一時的) request.session['page_followed_status'] = followed params = { # 省略 'page_followed_status': followed, 'page_followed_status_code': followed_status_code, } return render(request, 'result.html', params)該当箇所のみ記載しています。
followed_status
関数を呼び出してフォロー状態を確認しています。
(followed_status
関数では、ステータスコードとフォロー状態が返されます。)
そしてセッションに一時的に保存してます。urls.pyの編集
urls.pyurlpatterns = [ # 省略 path('元のページ', views.pages, name='各自で設定'), path('元のページ/follow/', views.follows, name="follows"), # 省略 ]テンプレートの編集
最後にテンプレートです。
result.html<!-- フォローボタンを追記 --> {% if page_followed_status_code is 2 %} {% if page_followed_status is False %} <p><a href="{% url 'follows' page_accesskey %}">フォローする</a></p> {% else %} <p><a href="{% url 'follows' page_accesskey %}">フォローをやめる</a></p> {% endif %} {% endif %}
ステータスコードが2
の場合(自分自身でなく他人同士の場合)のみ表示されるようになっています。そしてフォロー状態が
False
のとき「フォローする」、True
のとき「フォローをやめる」と表示させるためif分岐させています。リンクが押されるとページ移動先でfollows関数が呼び出されフォロー処理をして、また元のページにリダイレクトされるような流れになってます。
最後に
自分なりにコードを改変して使ってみてください。
「いいね機能」もほぼ同様に実装することができます!
- 投稿日:2020-11-18T16:07:33+09:00
[丁寧に解説] DDLファイルを使ってMySQLデータベースを共有する方法
チーム開発の問題
チームでアプリ開発を行っている学生です。
先日こんなことがありました。
バックエンドを担当しているメンバーが、ローカルで作成したデータベースを共有したいと。
皆さんの解決方法を是非ご教授いただきたいのですが、私達はDDLファイルを使っての共有を行いました。DDLとは
データ定義言語(Data Definition Language, DDL)は、コンピュータ利用者あるいはアプリケーションソフトウェアが、コンピュータのデータを定義するコンピュータ言語もしくはコンピュータ言語要素である。
つまり、DDLファイルとはデータベースを定義するためのコンピュータ言語を記入したファイルのことになります。
データベースの共有
このファイルをアプリケーションのディレクトリに配置し、Gitなどで管理すればメンバーへの共有が簡単に行えます。
ただのファイルですから、通常のコードと扱いは同じです。実行環境
OS: Windows
コンソール : Git Bash
DB : MySQL( Server version: 8.0.22 )
共有 : Git
参考記事 + やること
MySQLでファイルからSQLを実行する
今回は、上記のQiitaの記事を参考に行わせて頂きました。
この記事では、以下の手順を解説いたします。
1. DDLファイルの作成
2. DDLファイルの実行
3. コードの共有 (Gitの解説になるので、割愛)
やりかた
1. DDLファイルの作成
/* DBの作成*/ CREATE DATABASE testdb; /* テーブルの作成 */ CREATE TABLE testdb.user( ID int, name varchar(10), mail varchar(20) ); /* テーブルへのデータ追加 */ insert into testdb.user values(1, 'test1', 'test1@abc.co.jp'); insert into testdb.user values(2, 'test2', 'test2@abc.co.jp'); insert into testdb.user values(3, 'test3', 'test3@abc.co.jp'); ※DDLファイルにコメントを追加する際は、//ではなく、/**/を使わないとコメントと認識しないのでご注意を!このファイルは、setup_db.ddlというファイル名で保存します。
2.DDLファイルの実行
さぁ、作ったDDLファイルを実行してみよう!
準備
- MySQLをPCにインストール
- コンソールにパスを通す
- コンソール上で、先程作ったDDLファイルがあるディレクトリに移動する。
実行
mysql -u root -p < setup_db.ddlログインする時に使ういつものコマンドに、「<」、ファイル名を連結する。
このあとにパスワードを入力し、何のメッセージも返ってこなかったら成功!コードの共有
通常のファイルと同じ扱いができるので、Gitで管理しているディレクトリにファイルを追加して、PUSHすれば共有完了です。
まとめ
今回は、間接的な意味でDBの共有の仕方について解説させていただきました。
DBの共有をする際の正しいやり方、デファクトスタンダードは存じ上げないので、もし他の方法があるなら教えて下さい。
- 投稿日:2020-11-18T13:29:50+09:00
【素人の備考録】Raspberry Pi 3,Wordpress vs Raspberry Pi 3,python,Django
初めに・・・
インフラエンジュニアとして20年以上働いています。
自分用のWebサーバをRaspberryPiで構築した時の備考録です。HomeLan環境機器
ルーター:YAMAHA NVR500
サーバ1:Raspberry Pi model 3
サーバ2:Raspberry Pi model 3B
DNS: ネットボランチDNSサービス XXXXXX.netvolante.jp
1.Raspberry Pi model 3、WordPress
サーバ構築について
色々なサイトを参考にして構築しました。稼働状況について
2016年5月から稼働しています。WordPressで構築しました。
ほぼ毎日、iPhoneよりWordPressアプリを使い画像、動画を投稿しています。
2020年11月にシステム更新を行い、自己証明書も設定しました。
投稿しているファイル(iPhone 12 pro Maxのカメラを使用)
画像ファイル jpg 約5MB
動画ファイル mov 約20MB 撮影時間約20秒システム概要について
確認日時:2020/11/3
Linux raspberrypi 4.9.35-v7
Wordpress 4.8 から 5.5.3-ja に更新
PHP 5.6.40-0+deb8u12 から PHP 7.4.11 に更新
mysql Ver 15.1 Distrib 10.1.47-MariaDB
Apache/2.4.25 (Raspbian)
SSH tcp port 443システム稼働中メモリ容量
pi@raspberrypi:/ $ free
total used free shared buff/cache available
Mem: 945512 204728 382040 26192 358744 654512
Swap: 0 0 0SDカード使用容量:64GB(2016年5月より)
pi@raspberrypi:/ $ df
ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置
/dev/root 59460156 20191148 36825620 36% /
devtmpfs 468148 0 468148 0% /dev
tmpfs 472756 0 472756 0% /dev/shm
tmpfs 472756 6284 466472 2% /run
tmpfs 5120 4 5116 1% /run/lock
tmpfs 472756 0 472756 0% /sys/fs/cgroup
/dev/mmcblk0p1 61384 22256 39128 37% /boot
tmpfs 94548 0 94548 0% /run/user/10002.Raspberry Pi model 3B、python3.8.6など
サーバ構築について(下記サイトを参考にしました)
参考にしたサイト
MacでRaspberryPi入門
https://qiita.com/shippokun/items/9070fc58f69d8c063e44OSはミラーサイトより
https://www.raspbian.org/RaspbianMirrors
OS:2020-08-20-raspios-buster-arm64.img → 64bitを使用参考にしたサイト
さくらのVPSで、https対応かつDjango+uWSGI+nginxなアプリのログイン機能を実装してみた
https://qiita.com/ezmscrap/items/26b1897923db3665ac1c参考にしたサイト
『超入門』Djangoで作る初めてのウェブアプリケーション Part1(Pythonインストール)
https://note.com/takuya814/n/n5c156740b4ef参考にしたサイト
Django SQLite3からMySQLへの移行
https://qiita.com/ta2mi/items/0547de41d021d67ac3dc備考
OSを2020-08-20-raspios-buster-arm64.img(64ビット)にしてシステム構築時のトラブル等は
一切ありませんでした。
構築したアプリケーションで画像ファイルをiPhone,Safariより投稿できることを確認しました。システム概要について
確認日時:2020/11/18
Linux raspberrypi3b 5.4.72-v8+ #1356 SMP PREEMPT
Thu Oct 22 13:58:52 BST 2020 aarch64 GNU/Linux
PHP 7.3.19-1~deb10u1 (cli)
Python 3.8.6
mysql Ver 15.1 Distrib 10.3.25-MariaDB
nginx/1.14.2
Django version 3.1.3
SSH tcp port 8443システム稼働中メモリ容量
pi@raspberrypi3b:~$ free
total used free shared buff/cache available
Mem: 934396 317252 319736 6620 297408 552316
Swap: 102396 9472 92924SDカード128GB:使用容量
pi@raspberrypi3b:~$ df
ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置
/dev/root 123588468 4192636 114327400 4% /
devtmpfs 335612 0 335612 0% /dev
tmpfs 467196 0 467196 0% /dev/shm
tmpfs 467196 12104 455092 3% /run
tmpfs 5120 4 5116 1% /run/lock
tmpfs 467196 0 467196 0% /sys/fs/cgroup
/dev/mmcblk0p1 258095 56073 202023 22% /boot
tmpfs 93436 0 93436 0% /run/user/1000後書き
各サイトを参考にして、サーバ構築をしました。pythonに興味があり、ブログサイトを構築となりましたが、今回は、検証用に構築し、自己証明書も設定しました。
pythonでの構築には機能の追加等多いに期待はできると思いますが
以前から稼働しているWordPressと比べて当然ながら手間がかかります。構築後の事を考えると仕事でブログサイトを構築となると運用管理面からWordPressになるでしょう。
インフラ関連の仕事をしてきて、オンプレミスでのサーバ構築が全てでしたが、AWSなどのウェブでのサーバ構築に興味があり、1年間の無料枠でEC2、EBS、mysqlでWordPress、VNCが短時間で構築出来ました。
時代の流れに流されないよう色々な情報取得には、このサイトが多いに役に立つと思います。
- 投稿日:2020-11-18T12:27:48+09:00
404エラーを返すWordPress投稿を修正する方法
WordPressは強力なCMSですが、わずかな調整によりWebサイトにアクセスできなくなる場合があります。ただし、WordPressの問題の解決策を見つけるのは非常に簡単です。WordPressユーザーが直面する最も一般的な問題のいくつかあります。例えば内部サーバーエラーまたはデータベース接続の確立エラーなどです。そして、ほとんどのWordPressユーザーがいつか直面するもう1つの一般的な問題は、WordPressの投稿が404エラーを返すことです。この記事では、404エラーを返すWordPressの投稿を修正する方法を紹介します。
通常、ユーザーはブログのメインページであるWordPress管理エリアにアクセスできますが、単一の投稿にアクセスすると、404 Notfoundエラーが発生する場合があります。そういった場合でもほとんどの場合、慌てる必要はありません。そういった時の原因は主に2つです。
①htaccessファイルが削除された
②書き換えルールに問題が発生したそこで行うべきアクションはパーマリンク設定を修正することです
「設定」⇨「パーマリンク」に移動し、「設定を保存」をする。ただこれだけ。
これにより、パーマリンク設定が更新され、書き換えルールがフラッシュされます。ほとんどの場合、このソリューションはWordPressの投稿404エラーを修正します。ただし、それが機能しない場合は、.htaccessファイルを手動で更新する必要があります。
FTPを使用してサーバーにログインし、/ wp-content /や/ wp-includes /などのフォルダーと同じ場所にある.htaccessファイルを変更します。最も簡単な方法は、アクセス許可を666に変更して、ファイルを一時的に書き込み可能にすることです。次に、元の解決策を繰り返します。権限を660に戻すことを忘れないでください。次のコードを.htaccessファイルに手動で追加することもできます。
BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPressローカルサーバーの修正
多くの場合、デザイナーや開発者は、テスト目的でローカルサーバーを使用してコンピューターにWordPressをインストールします。綺麗なパーマリンクを使用したい場合は、MAMP、WAMP、またはXXAMPのApache構成でrewrite_moduleを有効にする必要があります。
以上が404エラーに対しての処理になります。もしよろしかったらコメント待っています。
- 投稿日:2020-11-18T02:30:18+09:00
UbuntuでMySQLの外部公開とログイン
このタイトルのような記事は多く存在するのですが,Ubuntuでの例が少ないのか,
一筋縄では行かなかったので記事にすることにしました.環境
Version ホストOS Ubuntu Server 20.04.1 LTS ホスト側MySQL Ver 8.0.22 クライアント側MySQL(MariaDB) 10.3.23-MariaDB 今回クライアント側は
Raspberry Pi
を使用していたので,mariaDB
を使用しています(raspbianにはmysqlが入らなかった?).
MySQLとmariaDBはほぼ互換なので,MySQL8系同士でやるなら問題ないと思います.しかし,MariaDBの10.3はMySQLの5.7に相当するそうなんですが,
5系から8系にログインする際には問題が発生するのでそれについても以下で解説します.ホスト側とクライアント側にそれぞれMySQLはインストール済みとします.
[ホスト側] 外部公開の設定
デフォルトではlocalhostしか接続できない設定になっているので,公開範囲を設定します.
/etc/mysql/mysql.conf.d/mysqld.cnf
にアクセスして,bind-address
のところを以下のようにします.$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf/etc/mysql/mysql.conf.d/mysqld.cnfbind-address = 0.0.0.0 default_authentication_plugin=mysql_native_password #クライアント側が5系の時にはこの行も追加.8系の時は不要.設定が終わったらMySQLを再起動します.
$ /etc/init.d/mysql restart
[ホスト側] 接続用のユーザを作成
MySQLにログインし,以下のコマンドでユーザを作成します.
ここではadmin
がユーザ名,@以降の'%'
は任意のIPアドレスを意味します.CREATE USER 'admin'@'%' IDENTIFIED BY 'P@ssw0rd'; GRANT ALL ON *.* TO 'admin'@'%';以下のコマンドで確認しましょう.
select user,host from mysql.user;次のようになっていたらOKです.
mysql> select user,host from mysql.user; +------------------+-----------+ | user | host | +------------------+-----------+ | admin | % | | debian-sys-maint | localhost | | mysql.infoschema | localhost | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | +------------------+-----------+リモート側からログイン
リモート側からログインしてみましょう.
$ mysql -u admin -h [IPアドレス] -pリモート側がMySQL8系ならこれでログインできると思います.
MySQL5系から8系にログインする
もしリモート側が5系の場合,以下のようなエラーがでると思います.
ERROR 1045 (28000): Plugin caching_sha2_password could not be loaded: /usr/lib/arm-linux-gnueabihf/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directoryこれは認証プラグインが8系で変更されてしまったためです.
今回はホスト側の認証プラグインを5系で使用されていたものに変更する形で解決したいと思います.MySQLの設定に次を加えます.
(上の設定ではこちらを加えた状態で記載しました)$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf/etc/mysql/mysql.conf.d/mysqld.cnfdefault_authentication_plugin=mysql_native_password設定が終わったらMySQLを再起動します.
$ /etc/init.d/mysql restart
これで先程と同じようにユーザを作成することで,認証プラグインが変更されます.
確認してみましょう.mysql> select user,host,plugin from mysql.user; +------------------+-----------+-----------------------+ | user | host | plugin | +------------------+-----------+-----------------------+ | admin | % | mysql_native_password | | debian-sys-maint | localhost | caching_sha2_password | | mysql.infoschema | localhost | caching_sha2_password | | mysql.session | localhost | caching_sha2_password | | mysql.sys | localhost | caching_sha2_password | | root | localhost | auth_socket | +------------------+-----------+-----------------------+
参考URL
https://qiita.com/katzueno/items/e735950c7440f232ef27
https://sys-guard.com/post-8501/
https://symfoware.blog.fc2.com/blog-entry-2159.html
https://www.s-style.co.jp/blog/2018/05/1807/