#postgresql #ubuntu-14.04 #amazon-elastic-beanstalk #rds
#postgresql #ubuntu-14.04 #amazon-elastic-beanstalk #rds
Вопрос:
У меня есть локальная база данных Postgres на моем локальном компьютере. Теперь я хотел бы объединить локальный файл базы данных Postgres с существующей базой данных AWS RDS. Кто-нибудь знает, как это сделать? Заранее благодарю вас.
Комментарии:
1. Ваш экземпляр RDS находится в общедоступной или частной подсети?
2. Экземпляр RDS находится в частной подсети. Я использую команду для восстановления базы данных Postgres pg_restore -v -h xxx -U master -d test /home /xxx/Documents /xxx/DB/back.backup
3. Во время подключения к rds я получаю сообщение об ошибке «Сервер, запущенный на хосте «xxx» (ххх), принимает соединения TCP / IP через порт 5432?»
Ответ №1:
Если экземпляр RDS находится в частной подсети, то вам необходимо выполнить туннелирование через экземпляр EC2, чтобы добраться до вашего экземпляра RDS. Предполагая, что ваши группы безопасности настроены так, что вы можете подключиться по ssh к экземпляру EC2, а экземпляр EC2 имеет доступ к RDS через порт 5432, вы можете сделать следующее:
- Создайте дамп вашей локальной базы данных:
$ pg_dump -Fc --no-acl --no-owner -h localhost -U<username> <database_name> -f <filename>
где <username>
— имя пользователя Postgres на локальном компьютере (‘postgres’ — пользователь по умолчанию). Например:
$ pg_dump -Fc --no-acl --no-owner -h localhost -Upostgres my_development_db -f data.dump
- На вашем локальном компьютере настройте туннель к экземпляру RDS. В этом примере предполагается, что
ec2-user
является пользователем по умолчанию в вашем экземпляре EC2, что имеет место, если вы используете изображение AWS.
$ ssh -i /path/to/ssh/key -fNL 5433:[database_host]:5432 ec2-user@[app_host]
Например:
$ ssh -i ~/.ssh/ida_rsa -fNL 5433:my_prod_db.cbaxyzxyz.us-west-1.rds.amazonaws.com:5432 ec2-user@ec2-11-222-333-4.us-west-1.compute.amazonaws.com
- Затем, все еще на вашем локальном компьютере, импортируйте дамп локальной базы данных на удаленный сервер базы данных RDS:
$ pg_restore --no-owner -n public -c -1 -p 5433 -U<username> -h 127.0.0.1 -d <database_name> <filename>
Например:
$ pg_restore --no-owner -n public -c -1 -p 5433 -Umy_prod_username -h 127.0.0.1 -d prod_db_name data.dump
Введите пароль базы данных RDS при появлении запроса.
Обратите внимание, что -c
(«очистить») опция удалит объекты базы данных перед их воссозданием из локального дампа базы данных.
Комментарии:
1. Я использую AWS elastic beanstalk. Я не могу установить туннель с помощью следующей команды
ssh -i ~/.ssh/xyz.pub -fNL 5433:xxx.rds.amazonaws.com:5432 ec2-user@xxx.elasticbeanstalk.com
2. Я не уверен, каким здесь будет имя пользователя. Это имя пользователя базы данных rds или aws elastic beanstalk?
3. Кроме того, я также создал ssh для среды aws elastic beanstalk, используя команды eb ssh —setup и используя открытый ключ ~/.ssh/xyz.pub. Не уверен, что я делаю здесь что-то не так.
4.
debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 19: Applying options for * debug2: resolving "xxx.elasticbeanstalk.com" port 22 debug2: ssh_connect_direct: needpriv 0 debug1: Connecting to xxx.central-1.elasticbeanstalk.com [xxx] port 22. debug1: connect to address xxx port 22: Connection refused debug1: Connecting to xxx.elasticbeanstalk.com [xxx] port 22. debug1: connect to address xxx port 22: Connection refused ssh: connect to host xxx.elasticbeanstalk.com port 22: Connection refused
5. Я могу подключиться, используя имя среды eb ssh