wordpress admin 계정 복구

Page content

문제

블로그 보는 거 자체는 문제가 없는데 admin 계정으로 로그인 시도하면 반복해서 로그인 페이지로 redirect됨

http://sosa0sa.com/wp-login.php?redirect_to=http://sosa0sa.com/wp-admin/&reauth=1

구글링을 하니 대부분 쿠키를 초기화하고, theme, plugin등을 초기화하라는 의견이 대부분. 모두 따라해 봤으니 제대로 동작하지 않는다… -_-;;;

마지막으로 wp_usermeta table에서 session_token 값을 초기화하라는 말이 있어 이것도 해 보기로. phpmyadmin을 설치해서 table의 값을 변경하라고 해서 phpmyadmin을 역시 docker로 설치해 보기로

https://wordpress.org/support/topic/possible-fix-for-sudden-redirect-loop-at-wp-login-with-reauth1/

Phpmyadmin docker 설치

Wordpress ansible-playbook 에 다음과 같이 추가

links를 통해 mysql container와 연결하고 PMA_HOST를 해당 mysql container의 name으로 지정하는 것이 중요한 내용임. 처음에는 PMA_HOST를 “localhost”나 “127.0.0.1”로 지정하니 정상적으로 mysql에 로그인이 되지 않음

- name: Start phpmyadmin
    docker_container:
      name: phpmyadmin
      image: phpmyadmin/phpmyadmin
      links:
         - mysql:mysql
      # always pull the latest image
      pull: no
      state: started
      recreate: yes
      restart_policy: "always"
      ports:
         - "8181:80"
      env:
           PMA_HOST: "mysql"
           MYSQL_USERNAME: "root"
           MYSQL_ROOT_PASSWORD: "root_password"

그런데 mysql로 접속했는데 mysql의 DB 내용이 정상적으로 나오지 않음. 그런데 phpmyadmin 을 설치한 후 주소(http://192.168.1.200:8181)를 접근하니 예전에 본것과 다르게 뭔가 허전한 화면만 나온다.

아는 것도 없지만 그래도 혹시나 하고 docker에 bash로 접근해서 얼마전에 influxDB에서 사용해 본 명령어가 같을 듯 해서 입력해 봤는데 이것도 제대로 동작하지 않는다.

mini2:~ cychong$ docker exec -it a7681c4ec35e bash
root@a7681c4ec35e:/# mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
root@a7681c4ec35e:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 39
Server version: 8.0.11 MySQL Community Server - GPL

Copyright (c) 2000, 2018, 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> show databases;
ERROR 1449 (HY000): The user specified as a definer ('mysql.infoschema'@'localhost') does not exist

web으로 다시 phpmyadmin 화면에 접근했을 때 나온 에러 메시지를 찾아보기로 바로 이거

The user specified as a definer ('mysql.infoschema'@'localhost') does not exist

구글링을 하니 역시나 흔한 문제인 듯. 다음과 같은 글을 찾을 수 있어 글에서 시킨대로 해봤다.

https://stackoverflow.com/questions/49992868/mysql-errorthe-user-specified-as-a-definer-mysql-infoschemalocalhost-doe

암호는 container 생성할 때 인자로 넣어주는 MYSQL_ROOT_PASSWORD값을 사용한다. wordpress.yaml 파일에서 확인 가능..

root@a7681c4ec35e:/var/log# mysql_upgrade -u root -p
Enter password:
Checking if update is needed.
Checking server version.
Running queries to upgrade MySQL server.
Upgrading system table data.
Checking system database.
mysql.columns_priv                                 OK
mysql.component                                    OK
mysql.db                                           OK
mysql.default_roles                                OK
mysql.engine_cost                                  OK
mysql.func                                         OK
mysql.general_log                                  OK
mysql.global_grants                                OK
mysql.gtid_executed                                OK
mysql.help_category                                OK
mysql.help_keyword                                 OK
mysql.help_relation                                OK
mysql.help_topic                                   OK
mysql.innodb_index_stats                           OK
mysql.innodb_table_stats                           OK
mysql.ndb_binlog_index                             OK
mysql.password_history                             OK
mysql.plugin                                       OK
mysql.procs_priv                                   OK
mysql.proxies_priv                                 OK
mysql.role_edges                                   OK
mysql.server_cost                                  OK
mysql.servers                                      OK
mysql.slave_master_info                            OK
mysql.slave_relay_log_info                         OK
mysql.slave_worker_info                            OK
mysql.slow_log                                     OK
mysql.tables_priv                                  OK
mysql.time_zone                                    OK
mysql.time_zone_leap_second                        OK
mysql.time_zone_name                               OK
mysql.time_zone_transition                         OK
mysql.time_zone_transition_type                    OK
mysql.user                                         OK
Found outdated sys schema version 1.5.1.
Upgrading the sys schema.
Checking databases.
sys.sys_config                                     OK
wordpress_db.wp_commentmeta                        OK
wordpress_db.wp_comments                           OK
wordpress_db.wp_links                              OK
wordpress_db.wp_options                            OK
wordpress_db.wp_postmeta                           OK
wordpress_db.wp_posts                              OK
wordpress_db.wp_term_relationships                 OK
wordpress_db.wp_term_taxonomy                      OK
wordpress_db.wp_termmeta                           OK
wordpress_db.wp_terms                              OK
wordpress_db.wp_usermeta                           OK
wordpress_db.wp_users                              OK
Upgrade process completed successfully.
Checking if update is needed.
root@a7681c4ec35e:/var/log#

이제 다시 phpmyadmin화면을 접근하니 이제 정상적인(?) 뭔가가 보인다.

phpmyadmin_works

뭔가 제대로 되는 것 같다. 다시 wordpress admin 계정으로 로그인하니 이젠 된다!!! Finally…

그래도 안될때

(2019.02.28) wordpress가 5.1로 업데이트 되어 그걸 적용했더니 database 파일도 업그레이드를 해야 한다고. 그래서 해라 그랬더니 또 로그인이 안된다. 이번에는 위의 mysql_upgrade 명령을 써도 안되고….

다행히 구글링에서 유용한 정보를 찾았다. 처음 본 순간 왠지 잘 될 것 같았는데 정말로 한번에 문제를 해결해줬다. https://www.fixrunner.com/cannot-login-wordpress-admin-area/

한 줄 요약하면 mysql database에 저장되어 있는 로그인 암호를 직접 변경하는 것.

wordpress database에서 wp_user라는 테이블의 user_pass라는 필드를 변경하는 거다. phpmyadmin으로 수정하는 창에서 보니 결국(?) 이런 sql 명령으로 변경할 수 있다고 한다. 아래 새 암호에 원하는 새로운 암호를 넣으면 그걸 md5 hash한 값을 user_pass 필드에 저장한다.

UPDATE `wp_users` SET `user_pass` = MD5('새 암호') WHERE `wp_users`.`ID` = 1;

다행히 오랫동안 헤매지 않고 해결해서 다행이다.