(2019-08-22)
あれこれと検索してたらサクラのVPSサーバー側のMySQLのユーザー権限で外部からのアクセスが出来るようになるとあった。以下実施してみたらうまく行った。
ラズパイからsshでrootで入る。
#mysql -uroot -pkxxx6
サクラのMySQLはlocalhostしか設定されていない。
mysqlのuserを追加
mysql> grant all on cake_db.* to test_user@”%” identified by ‘kxx6’;
Query OK, 0 rows affected (0.01 sec)
mysql>flush privileges;
??うまく行かないが・・・
必要なくなったらしい。grantは自動でフラッシュされるとある。
mysql> grant all on cd_rom.* to test_user@”%” identified by ‘kxxxx6’ with grant option;
Query OK, 0 rows affected (0.00 sec)
・ユーザー名は不要だがパスワードはシングルクオートが必要だ。
・test_userは追加された。データベースは存在しないものでも登録というか認識許可となるようだ。以下を再度実行して存在するデータベースを有効にする。
mysql> grant all on cake_db.* to test_user@”%” identified by ‘kxxx6’ with grant option;
データベースは*.*を追加ユーザーでは許可しないようだ・・・。
mysql> select user,host from mysql.user;
+———–+———–+
| user | host |
+———–+———–+
| db_user | % |
| test_user | % |
| root | 127.0.0.1 |
+———–+———–+
11 rows in set (0.00 sec)
●確認
[root@www8384ui ~]# mysql ーhmk.jp -utest_user -pkxx6
mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| cake_db |
+——————–+
使えるデータベースが制限されている。というか割り当てられた。
mysql> show grants;
+————————————————————————–+
| Grants for test_user@% |
+————————————————————————–+
| GRANT USAGE ON *.* TO ‘test_user’@’%’ IDENTIFIED BY PASSWORD
| GRANT ALL PRIVILEGES ON `cake_db`.* TO ‘test_user’@’%’ WITH GRANT OPTION |
| GRANT ALL PRIVILEGES ON `cd_rom`.* TO ‘test_user’@’%’ WITH GRANT OPTION |
+————————————————————————–+
それではここで、ラズパイからホストに向けて接続を行ってみた。
ラズパイ側にもMySQLをインストールしておかないとmysqlコマンドが使えないので注意
root@rasp2:/home/pi# mysql -hmakxx.jp -utest_user -pkxxx6
MySQL [(none)]> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| cake_db |
+——————–+
2 rows in set (1.15 sec)
MySQL [(none)]>
これで外部からのPCでサクラVPSのMySQLサーバーにアクセスできることになった。
これは便利だ!感激!!
●外部PCからサクラVPSのMySQLへアクセスする。(ラズパイとWindows7で実行)
※windows7はプロクシを外してのアクセス
/#!/usr/bin/python3
import MySQLdb
conn = MySQLdb.connect(
user ='test_user',
passwd='kxxx6',
host='makexx.jp', <-- 数字IPでなくともいける
db='cake_db',
charset='utf8') <-- これがないと文字化けになる
cur = conn.cursor()
cur.execute("SELECT kind_string from kinds;")
print(cur.description)
print()
for row in cur:
print(row)
cur.close()
conn.close()
同じものを以下にも(シンタクスハイライトの違いを見るため)
/#!/usr/bin/python3
import MySQLdb
conn = MySQLdb.connect(
user ='test_user',
passwd='kxxx6',
host='makexx.jp', <-- 数字IPでなくともいける
db='cake_db',
charset='utf8') <-- これがないと文字化けになる
cur = conn.cursor()
cur.execute("SELECT kind_string from kinds;")
print(cur.description)
print()
for row in cur:
print(row)
cur.close()
conn.close()
実行した結果。うまくいった。
pi@rasp2:~/work/sql $ ./connect.py
((‘kind_string’, 253, 21, 150, 150, 0, 1),)
(‘未分類’,)
(‘ひらめき’,)
(‘課題’,)
(‘開発ツール’,)
(‘PHP’,)
(‘SQL’,)
(‘JavaScript’,)
(‘WEB制作’,)
(‘PhpStrom’,)
(‘Unity’,)
以下ができるようになるにはそのアクセスする側にもMySQLがないと駄目だとか。
まあ理解できるかな。c#で外部からとはちょっと違いうかな。でもローカルからリーモートのDBを操作できるのは便利だね(勘違いしてないよね。確認が必要だな)。
$mysql -h mk.jp -uuser1 -p
passwd: xxxxx
ホストからの接続でのサーバー側の設定をした確認のためにc#で作成してアクセスしてみる。会社では専らそれだからね。ただし会社のIPはプロクシで範囲が決まっている。今回はパブリックなIPに対して接続するもの。以下はSSHでローカルのいサーバーに接続だから、少し違う。sshでなら参考になるので記載しておくことに。
考えて見たらサクラVPSはlocalhostで自分にアクセス(WEB)のプログラムだけだった。
外部から接続は考えてなかった。以下が参考になるね。
以下はWindowsからODBCでラズパイのMySQLへアクセスする例だ(これもいいね)。
http://marchan.e5.valueserver.jp/cabin/comp/jbox/arc102/doc10203.html
/* Your code... */
※ ''で囲むときはシングルクオートは必要だ。
select user,host from mysql.user;
mysql> grant all privileges on client_data.* to user1@"192.168.1.%" identified by 'パスワード' with option;
DROP USER 'user'@'localhost';
$mysql -h makejapan.jp -u user1 -p
passwd: ......
ここを参考にしてやってみる。
$pip3 install PyMySQL <—これではないようだ
sakuta VPS mk.jpにあるサーバーにアクセスしてみる
DB:cake_db
table: kinds
kind_id,
kind_num,
kind_string
開発環境を入れてからとあるが、撥ねられた。不要なようだ。
$pip3 install mysqlclient
$pip3 show mysqlclient
情報が表示される。
ううむ3.6版だとijmportできない
インポートは名前が変わるとある・・・。
/* Your code... */# 接続する
conn = MySQLdb.connect(
user='root',
passwd='root',
host='localhost',
db='mysql')
# 接続を閉じる
con.close
まだ不足があるようだ以下を参考にツールを追加
https://pypi.org/project/mysqlclient/
3.6ではimportできないが、3.5ではOKだ・・・。ベリーコンダはやめようかな。なんだかラズパイは版管理が面倒だ。4Bでメモリ増えたものでubuntouでやるかな。(逃げるなよ!!)
エラーメッセージを見るとauが云々で Access denied が・・・。ルータの制か?
これは、サクラ側のMySQLの許可がないからなようだ。MySQLで設定が必要だ。
以下は会社のIP内でアクセスさせてうまく行ったものサクラのIPで実施したもの。
# モジュール読み込み
import pymysql.cursors
# MySQLに接続する
connection = pymysql.connect(
host='133.243.255.258',
user='root',
password='kxx6',
db='aoc',
charset='utf8',
# cursorclassを指定することで
# Select結果をtupleではなくdictionaryで受け取れる
cursorclass=pymysql.cursors.DictCursor)
print("------------------------- SQLを実行する -----------------------");
with connection.cursor() as cursor:
sql = "SELECT * FROM cake_db.kinds;"
cursor.execute(sql)
# Select結果を取り出す
results = cursor.fetchall()
for r in results:
print(r)
# MySQLから切断する
connection.close()