雑多なノート

プログラミング初心者がメモとかを書きます。基礎的なこともメモとして。偏食系のアニオタ。

pythonのMySQLdbを入れるまでに起こったエラー

環境

  • CentOS6.9
  • Python2.6.6

やったこと

サーバーの初期設定とMySQLのインストールは終わったのでPythonの環境整えようとまずはMySQLdbを入れようとした.
そしたら例によってエラー.

標準的な環境でやってるのになんでこんなにあっさりいかないのかなー.

まずは,ググって出たサイト(pipの使い方とインストール - Python入門から応用までの学習サイト)に従ってpipのインストール

Pythonが古いと文句言われたがこれはすんなり成功した.
Pythonのバージョンの文句はCentOS作ってる方々に言ってほしい.

続いてMySQLdbのインストールを行おうとしたところでエラー発生.

$ sudo pip install MySQL-python
DEPRECATION: Python 2.6 is no longer supported by the Python core team, please upgrade your Python. A future version of pip will drop support for Python 2.6
Collecting MySQL-python
/usr/lib/python2.6/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:318: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.io/en/latest/security.html#snimissingwarning.
  SNIMissingWarning
/usr/lib/python2.6/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.io/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
  Downloading MySQL-python-1.2.5.zip (108kB)
    100% |################################| 112kB 5.3MB/s 
    Complete output from command python setup.py egg_info:
    sh: mysql_config: command not found
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-build-0cE_wY/MySQL-python/setup.py", line 17, in <module>
        metadata, options = get_config()
      File "setup_posix.py", line 43, in get_config
        libs = mysql_config("libs_r")
      File "setup_posix.py", line 25, in mysql_config
        raise EnvironmentError("%s not found" % (mysql_config.path,))
    EnvironmentError: mysql_config not found
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-0cE_wY/MySQL-python/

長々と何か言われてるが,mysql_configがないとのこと
ちゃんとMySQL入れてるのにね.

調べたらlibmysqlclient-devを入れろだの書いてあったがyumにそんなものはない.

CentOSの場合はmysql-community-devel.x86_64を入れれば良いらしい.
mysql_confがない場合(mysql-community-serverを使っていて) - Qiita

$sudo yum install mysql-community-devel.x86_64

この記事の人は勘で見つけたみたいなこと書いてるけど勘でわかるものなのか.

これで解決かと思いきや今度はまた別のところでエラー.

[kazuki@tk2-217-18051 tmp]$ pip install MySQL-python
DEPRECATION: Python 2.6 is no longer supported by the Python core team, please upgrade your Python. A future version of pip will drop support for Python 2.6
Collecting MySQL-python
  Using cached MySQL-python-1.2.5.zip
Building wheels for collected packages: MySQL-python
  Running setup.py bdist_wheel for MySQL-python ... error
  Complete output from command /usr/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-tAYCSR/MySQL-python/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" bdist_wheel -d /tmp/tmpHWaMcspip-wheel- --python-tag cp26:  running bdist_wheel
  running build
  running build_py
  creating build
  creating build/lib.linux-x86_64-2.6
  copying _mysql_exceptions.py -> build/lib.linux-x86_64-2.6
  creating build/lib.linux-x86_64-2.6/MySQLdb
  copying MySQLdb/__init__.py -> build/lib.linux-x86_64-2.6/MySQLdb
  copying MySQLdb/converters.py -> build/lib.linux-x86_64-2.6/MySQLdb
  copying MySQLdb/connections.py -> build/lib.linux-x86_64-2.6/MySQLdb
  copying MySQLdb/cursors.py -> build/lib.linux-x86_64-2.6/MySQLdb
  copying MySQLdb/release.py -> build/lib.linux-x86_64-2.6/MySQLdb
  copying MySQLdb/times.py -> build/lib.linux-x86_64-2.6/MySQLdb
  creating build/lib.linux-x86_64-2.6/MySQLdb/constants
  copying MySQLdb/constants/__init__.py -> build/lib.linux-x86_64-2.6/MySQLdb/constants
  copying MySQLdb/constants/CR.py -> build/lib.linux-x86_64-2.6/MySQLdb/constants
  copying MySQLdb/constants/FIELD_TYPE.py -> build/lib.linux-x86_64-2.6/MySQLdb/constants
  copying MySQLdb/constants/ER.py -> build/lib.linux-x86_64-2.6/MySQLdb/constants
  copying MySQLdb/constants/FLAG.py -> build/lib.linux-x86_64-2.6/MySQLdb/constants
  copying MySQLdb/constants/REFRESH.py -> build/lib.linux-x86_64-2.6/MySQLdb/constants
  copying MySQLdb/constants/CLIENT.py -> build/lib.linux-x86_64-2.6/MySQLdb/constants
  running build_ext
  building '_mysql' extension
  creating build/temp.linux-x86_64-2.6
  gcc -pthread -fno-strict-aliasing -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC -Dversion_info=(1,2,5,'final',1) -D__version__=1.2.5 -I/usr/include/mysql -I/usr/include/python2.6 -c _mysql.c -o build/temp.linux-x86_64-2.6/_mysql.o -g -fstack-protector -m64 -fPIC -g -fabi-version=2 -fno-omit-frame-pointer -fno-strict-aliasing
  _mysql.c:29:20: error: Python.h: No such file or directory
  _mysql.c:40:26: error: structmember.h: No such file or directory
  _mysql.c:74: error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token
   ・
  ・
   ・
 error: command 'gcc' failed with exit status 1
    
    ----------------------------------------
Command "/usr/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-QZvTFE/MySQL-python/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-qD2Kkc-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-QZvTFE/MySQL-python/

長々とエラーメッセージが現れた.
こんだけ長くて重要なのは最後じゃなくて中盤だから困る.
なんかPython.hといういかにもPythonで使うヘッダーが無いとのこと.
ヘッダーが無い時点で処理やめてくれればその後の長々としたエラーメッセージ要らないのに.

今度はpython-develを入れれば良いらしい.
gcc - fatal error: Python.h: No such file or directory - Stack Overflow

$ sudo yum install python-devel


これの後で無事インストールできた.


それにしても必要なものがあっちこっちにあると面倒.
pipくらいは最初から付けてくれてもいいのにな.


Pythonのバージョン上げてーなー
システム破壊しそうだから必要に駆られるまでやらんけど

MySQL初回起動

CentOS 6 / RHEL 6 に MySQL 5.6 を yum インストールする手順 | WEB ARCH LABO
MySQL 5.6 をインストールしたら最初に行うセットアップ | WEB ARCH LABO


MySQLを初めて起動したときの文言をメモ
ルートパスワードの変更とmysql_secure_installationを実行しろっていうことらしいけど
ずいぶん丁寧ですな

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:

  /usr/bin/mysqladmin -u root password 'new-password'
  /usr/bin/mysqladmin -u root -h XXXXXXX.vs.sakura.ne.jp password 'new-password'

Alternatively you can run:

  /usr/bin/mysql_secure_installation

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the manual for more instructions.

Please report any problems at http://bugs.mysql.com/

The latest information about MySQL is available on the web at

  http://www.mysql.com

Support MySQL by buying support/licenses at http://shop.mysql.com

Note: new default config file not created.
Please make sure your config file is current

WARNING: Default config file /etc/my.cnf exists on the system
This file will be read by default by the MySQL server
If you do not want to use this, either remove it, or use the
--defaults-file argument to mysqld_safe when starting the server

さくらのVPSのCentOSでSSHのポート変更に苦労した

定期的に全て消し去りたくなる悪い癖が発動してさくらのVPSの初期化をした.
この癖は今まで何度も発動してきたので初期設定は楽勝だと思ってたらSSHのポート変更をするところで摘んだ.

今まで通り,というかさくらのVPS初期設定ガイド通りにやったのだがポート変えたあたりでSSHで入れなくなった.

というか完全に弾かれる.

sshdの設定ファイルの変なところを弄ってしまったのかと思い面倒だったのでもう一回初期化してやってみたが同じ.

散々弄りまわしてみたらどうもファイアウォールで弾かれているらしい.

…なんで?

iptables -Lで規則見るとどうも何か書いてある.
前回まで空っぽだったような気がするのでもしかしたらバージョンアップで何かしらの変更があったのかもしれない.
今使ってるバージョン(CentOS6.9)はどうやら出たばっからしいし.

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
f2b-SSH    tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain f2b-SSH (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

iptablesはいつもコピペでやってるので詳しくは分からないけど,SSHと確立済みとローカル以外は拒否されようなことかいてあるっぽい.
上から評価していって最初に当てはまったものを適用するルールらしいので後からルールを追加しても6行目で引っかかって全部拒否されてたのかもしれない.

本当は適切な位置に挿入してやるのがいいのだろうけどやり方がよくわからないのでiptables -Fでルール全削除して今までやってたルールを適用したら変更後のポートでもつながるようになった.


最初からあるセキュリティ設定を全削除とか正気の沙汰とは思えないけど仕方ない.

h2b-sshって初めて見たけどなんなんだろう?
sshのセキュリティ関連らしいけどデフォで有効なのか

MySQLのバージョンを上げた

ググって出てきたコマンドを何も考えずにコピペしたら死んだ
まぁ考えても変わらなかったきもするけど


発端はツイッターのつぶやきをMySQLに入れたいと思ったときのこと.

get_tweet.py:62: Warning: (1366, "Incorrect string value: '\\xF0\\x9F\\x92\\x95\\xF0\\x9F...' for column 'tweet_text' at row 1")

MySQLからのエラー.
文字がおかしいだの言ってきた.

検索するとすぐに解決方法がでてきた.

blog.k11i.biz: UTF-8 エンコードされた絵文字を MySQL / JDBC で取り扱うには?

絵文字を含む文字を入れたい場合は文字コードにutf8mb4を設定すればいいらしい.

しかし,使っているのはMySQL5.1.
utf8mbを使うにはアップデートが必要らしい.

というわけでアップデート.
CentOS6にMySQL5.7をyumでインストール - Qiita

記事に従って進めていったがインストール後の起動でエラーになった.

$ sudo service mysqld start
MySQL Daemon failed to start.
mysqld を起動中:                                           [失敗]

この時点で軽く後悔していたのだがやってしまったものは仕方ないので解決法を探す.
ログを見てみるとなんかファイルサイズがおかしいとのこと.

2017-04-23T05:59:25.523092Z 0 [ERROR] InnoDB: The Auto-extending innodb_system data file './ibdata1' is of a different size an specified in the .cnf file: initial 768 pages, max 0 (relevant if non-zero) pages!
2017-04-23T05:59:25.523147Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2017-04-23T05:59:26.124374Z 0 [ERROR] Plugin 'InnoDB' init function returned error.
2017-04-23T05:59:26.124645Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2017-04-23T05:59:26.124681Z 0 [ERROR] Failed to initialize plugins.
2017-04-23T05:59:26.124776Z 0 [ERROR] Aborting

調べてみるとログファイルに記載されているファイルのサイズがおかしいから削除すべきとのこと.
何のファイルかは分からないけどデータベースに大したデータも入ってなかったので削除してみる.

もう一回実行してみるとまたエラー
削除してはいけないファイルだったかと思ったけど新しいファイルが作成されていたのでそうでもなさそうだった.

2017-04-23T06:03:02.062276Z 0 [ERROR] Fatal error: mysql.user table is damaged. Please run mysql_upgrade.

これは調べなくても分かる.
mysql_upgradeを実行しろということだろう.

$ sudo mysql_upgrade
mysql_upgrade: Got error: 2002: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) while connecting to the MySQL server
Upgrade process encountered error and will not continue.

MySQLサーバーが起動してないと怒られた.
起動時のエラーを直すためにやってるのに起動してからやれとかどうしろと.

調べるとセーフモードで起動すれば良いらしい.
なるほどね.
MySQL5.1→5.7へアップグレード - Qiita

$/usr/bin/mysqld_safe --skip-grant-tables &

これでセーフモードで起動した後,先ほどのコマンドを実行するといかにも治してるっぽい画面が出てきた.
診断のあと更新をしてるらしい.
そこそこ時間がかかる.

Upgrade process completed successfully.
Checking if update is needed.

最後にこれが表示されて終了.
なんとか正常に終わったらしい.

その後通常モードで起動したら成功.

長かった.

とりあえずこれで大丈夫かな.

Djangoでクエリ文字列を使う

Djangohttp://hogehoge?key=value形式の値の取得をした
url.pyで色々やって取得するのかと思ったけど見つからなかった

url.pyでは特に指定せずにrequest変数から取得できるらしい

def query_test(request):
    req_string = request.GET.get('name',1)

1つ目の引数がキーで2つ目がデフォルトの値らしい
古い記事しか見つからないのはこういうやり方は流行りじゃないからなのだろうか

X11ポートフォワーディングに失敗する

いつのまにかX11ポートフォワーディングに失敗するようになっていた

[vayacico@rabbit ~]$ xeyes
Error: Can't open display: localhost:10.0

OS再インストールしてから1回もやってなかった気がしたので何か入れるものあるのかと思ったけど設定ファイルがおかしかっただけだった

無駄にデスクトップ環境入れてしまった……

localhostping打って気付いたのだけどlocalhostが名前解決されないのが原因だったっぽい

[vayacico@rabbit ~]$ ping localhost
ping: unknown host localhost

ホスト名を変えるときに/etc/hostsのからlocalhostを消してしまったのが原因だったみたい

127.0.0.1   rabbit localhost.localdomain localhost4 localhost4.localdomain4
::1         rabbit localhost.localdomain localhost6 localhost6.localdomain6

127.0.0.1   rabbit localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         rabbit localhost localhost.localdomain localhost6 localhost6.localdomain6

のようにlocalhostを追加することで解決

ググっても全く引っかからないから焦った

まあこんなへまする奴が自分以外に居ないってことなんだろうけど

解決のために色々設定弄ったから変なところに影響でたら嫌だなぁ


そういえばGUIの動作確認でおなじみのxeyesってなんのために入ってるんだろ…?
何となくかわいいけど

X11ポートフォワーディングに失敗する

いつのまにかX11ポートフォワーディングに失敗するようになっていた

[vayacico@rabbit ~]$ xeyes
Error: Can't open display: localhost:10.0

OS再インストールしてから1回もやってなかった気がしたので何か入れるものあるのかと思ったけど設定ファイルがおかしかっただけだった

無駄にデスクトップ環境入れてしまった……

localhostping打って気付いたのだけどlocalhostが名前解決されないのが原因だったっぽい

[vayacico@rabbit ~]$ ping localhost
ping: unknown host localhost

ホスト名を変えるときに/etc/hostsのからlocalhostを消してしまったのが原因だったみたい

127.0.0.1   rabbit localhost.localdomain localhost4 localhost4.localdomain4
::1         rabbit localhost.localdomain localhost6 localhost6.localdomain6

127.0.0.1   rabbit localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         rabbit localhost localhost.localdomain localhost6 localhost6.localdomain6

のようにlocalhostを追加することで解決

ググっても全く引っかからないから焦った

まあこんなへまする奴が自分以外に居ないってことなんだろうけど

解決のために色々設定弄ったから変なところに影響でたら嫌だなぁ